C++笔记(6) 指针
1.指针和数组
指针和数组基本等价的原因在于指针算数和C++内部处理数组的方式。在很多情况下,可以用相同的方式使用数组名和指针名。
- 在多数情况下,C++将数组名视为数组的第一个元素的地址。指针p的值为数组第一个元素的地址,*p数组第一个元素的值。
- 将指针变量+1后,增加的量等于它指向的类型的字节数。比如,将指向double类型的指针加1后,指针值+8;将指向short类型的指针加1后,指针值+2。
两者之间的区别:
- 可以修改指针的值(p=p+1 (OK)),而数组名是常量(arrayname = arrayname+1 (ERROR))。
- 对数组应用sizeof运算符得到数组的长度,而对指针应用sizeof得到指针的长度。无论指针指向的数据类型是什么,sizeof(指针)=4。
#include <iostream>
using namespace std;
int main() {
short stacks[3] = { 3,2,1 };
cout << "stacks:" << stacks << endl;
cout << "&stacks[0]:" << &stacks[0] << endl;
short* p = stacks;
cout << "p:" << p << endl;
cout << "*p:" << *p << endl;
cout << "(p+1):" << (p + 1) << endl;
cout << "*(p+1):" << *(p + 1) << endl;
cout << "sizeof(p):" << sizeof(p) << endl;
return 0;
}
运行结果

2. 指针和字符串
1)如果给cout提供一个字符的地址,它将从该字符开始打印,直到遇到空字符为止。
下面为不同形式的字符串:
- 数组中的字符串
- 用引号括起来的字符串常量
- 指针所描述的字符串
char animal[10] = "bear";
const char* bird = "wren";
请看下面的代码:
char flower[10] = "rose";
cout << flower << endl;
char animal[4] = { 'f','i','s','h' };
cout << animal << endl;
运行结果:

在cout和大多数C++表达式中char数组名、char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。数组名flower是字符r的地址,数组名animal是字符f的地址。
2)一般来说,给cout提供一个指针,它将打印地址。但如果指针的类型为char *,则cout将显示指向的字符串。如果想要显示字符串的地址,则必须将这种指针强制转化为另一种指针类型,如int*。如下所示:
const char* bird = "wren";
cout << "bird:" << bird << endl;
cout << "(int*)bird:" << (int*)bird << endl;
运行结果:

3)在将字符串读入程序时,应使用已分配的内存地址。该地址可以是数组名,也可以是使用new初始化后的指针。
#include <iostream>
using namespace std;
int main() {
char flower[10];
cin >> flower;
cout << "flower:" << flower << ",(int*)flower:" << (int*)flower << endl;
cout << "sizeof(flower):" << sizeof(flower) << ",strlen(flower):" << strlen(flower) << endl;
char* p=new char[strlen(flower)+1];
strcpy_s(p, strlen(flower) + 1, flower);
cout << "p:" << p << ",(int*)p:" << (int*)p << endl;
delete [] p;
return 0;
}
运行结果:

3.指针和对象
使用对象指针时,需要注意以下几点:
使用常规表示法来声明指向对象的指针
String * s;
可以将指针初始化为指向已有的对象
String * s = &sayings[0];
可以使用new来初始化指针,这将创建一个新的对象
String * s = new String();
对类使用new将调用相应的类构造函数来初始化新创建的对象
String * s1 = new String();//调用了默认构造函数
String *s2 = new String("my my my");//调用了 String(const char *)构造函数
String *s3 = new String(sayings[0]);//调用了拷贝构造函数 String(const String &)
可以使用->运算符通过指针访问类方法
if(sayings[i].length() < s->length())
可以对对象指针应用解除引用运算符(*)来获得对象
if(sayings[i] < *s)
s = &sayings[i];
C++笔记(6) 指针的更多相关文章
- 《笨办法学C》笔记之指针
C语言编程主要操作的对象就是指针. 指针从哪里来 指针就是表示内存存储区域的一组数值,使用%p格式化字符串. Linux系统会为程序维护两个临时变量存储位置:栈.堆.栈的空间少,栈通常在用户更高的地址 ...
- Xenko基础API笔记3- Pointers指针设备屏幕上点对应的手指触摸。
样本这里是一个简单的示例程序,跟踪目前在屏幕上的指针和打印他们的位置.访问输入字段,类继承自@ SiliconStudio.Xenko.脚本的类. public override async Task ...
- iOS 阶段学习第八天笔记(指针)
iOS学习(C语言)知识点整理 一.指针 1)概念:存储变量的地址的一个变量. 2) 数据存储类型分析 1.text (代码段) :存储二进制的可执行代码 2.data(初始化的数据段) 存储初始化的 ...
- c++学习笔记——智能指针
智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...
- linux源码阅读笔记 void 指针
void 指针的步长为1,而其他类型的指针的步长与其所定义的数据结构有关. example: 1 #include<stdio.h> 2 main() 3 { 4 int a[10]; 5 ...
- 《C语言学习笔记》指针数组及其应用
C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...
- C学习笔记 - 指针
指针与数组 ,,,,}; int *p; p = a; printf("*a = %d\n",*a); printf("*p = %d\n",*p); prin ...
- C++笔记-数组指针/二维数组转换指针
参考资料: 1. 作者 BensonLaur :https://www.cnblogs.com/BensonLaur/p/6367077.html 2. https://blog.csdn.net/ ...
- C++ Primer 笔记——智能指针
1.新的标准库提供了两种智能指针类型,shared_ptr允许多个指针指向同一个对象,unique_ptr则独占所指的对象.标准库还定义了一个名为weak_ptr的伴随类,它是一种弱引用,指向shar ...
- Objective-C 学习笔记(五) 指针
Objective-C 指针 每一个变量是一个内存位置和每一个存储单元都有其定义的地址,可以使用符号(&)的运算符,它表示内存中的地址访问. a. 我们定义一个指针变量 b. 分配一个指针变量 ...
随机推荐
- .NET开源强大、易于使用的缓存框架 - FusionCache
前言 缓存在程序中扮演着提升性能.降低资源消耗.改善用户体验等重要角色,是构建高效.可伸缩.稳定的系统不可或缺的重要组成部分.今天大姚给大家分享一款.NET开源(基于MIT license).强大.易 ...
- 浅析Golang map的实现原理
Golang中的map底层使用的数据结构是hash table,基本原理就和基础的散列表一致,重点是Golang在设计中采用了分桶(Bucket),每个桶里面支持多个key-value元素的这种思路, ...
- 浏览器端实现类似input限制输入两位小数,输入时光标从输入位置移动到最后
1.问题描述展示 示例代码所做限制为不允许输入字母d,其他限制规则可以根据需求自己调整,使用React编写,其他框架或原生均可根据该代码理解原理进行转变,特意使用了中文键盘可以看到输入框下面白色框闪出 ...
- 一站式指南:ClkLog部署环境配置指南
在今天的数字化世界中,数据管理和分析工具的选择对于企业的成功至关重要.ClkLog作为一款强大的日志分析工具,能够帮助企业从海量数据中洞察业务.提升效率.然而,如何才能顺利部署ClkLog系统,使其最 ...
- 快速获取使用dblink的视图的全部字段
快速获取使用dblink的视图的全部字段 默认情况下,使用dblink连接的视图在PL/SQL是没法通过代码助手获取全部的字段的 如果要获取全部字段的话,可以使用一个奇怪的方法 对要获取的使用dbli ...
- 力扣50(java)-Pow(x,n)(中等)
题目: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即xn ). 示例 1: 输入:x = 2.00000, n = 10输出:1024.00000示例 2: 输入:x = 2.10 ...
- 通过Jenkins构建CI/CD实现全链路灰度
简介: 本文介绍通过 Jenkins 构建流水线的方式实现全链路灰度功能. 作者:卜比 本文介绍通过 Jenkins 构建流水线的方式实现全链路灰度功能. 在发布过程中,为了整体稳定性,我们总是希 ...
- dotnet 推荐 LightWorkFlowManager 轻量的工作过程管理库
本文将和大家推荐我团队开源的 LightWorkFlowManager 轻量的工作过程管理库,适合任何需要执行工作过程的应用逻辑,可以方便将多个工作过程拼凑起来,且自动集成重试和失败处理,以及日志和上 ...
- Solution Set - CDQ分治&整体二分
A[洛谷P2163].给定平面上若干个点,多次询问给定矩形内的点数. B[洛谷P3810].给定若干个三元组,对所有\(k\),求这样三元组的个数:恰有\(k\)个三元组,满足其每个分量都不超过它的相 ...
- CINN 中子图编译缓存机制
采用 「问-答」形式记录研读 CINN 开源框架的笔记 Q:CINN中子图编译的入口是在哪里? for (const auto& node_vec : clusters) { // <- ...