C++的指针
指 针
指针(pointer)是一个变量,该变量存储的是另一个变量的地址,其声明语句为
type *ptr_name;
type是指针的基类型,必须是一个有效的C++数据类型,ptr_name是指针变量的名称,* 星号用来声明指针,如下是有效的指针声明
int *ip; double *dp; float *fp; char *cp;
不管什么类型的指针,其实际的数据类型都是相同的,即一个代表内存地址的十六进制数,不同数据类型表示的是指向的变量或常量的数据类型不同
1. 获取对象的地址
使用取地址运算符&,用法如下
int num; int *ptr1 = # int *ptr2 = ptr1;
2. 指针值的状态
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针,意味着指针没有任何指向对象,指针变量的值为Null, int *ptr = Null ptr的值为0
- 无效指针,曾指向一个有效地址,但由于指针指向的内存单元被释放了,故不能用该指针访问原地址,不会产生一些问题
- 野指针,没有被正确的初始化,指向的是一个随机的内存地址,野指针是严重错误
利用指针访问对象时,使用解引用运算符 *
3. 指针的算术运算
指针是一个用于表示地址的数值,故可以对指针执行四种算术运算,包括 ++ 、--、+、-
指针的加减会对应在地址上加减数据类型所占的字节空间
假设ptr是一个指向地址1000的整形指针,是一个32位的整数,当对指针执行ptr++操作时,ptr指向的地址将变为1004,因为ptr增加一次,指向了下一个整数,每个整数占4个字节
指针还可==、!=、>、<进行比较
4. 指针和数组
指针和数组在大部分情况下可以互换,如下
#include<iostream> int nums[4] = {0,1,2,3}; int *ptr; ptr = nums; // 二者输出的都是0 cout << nums[0] << endl; cout << *ptr << endl;
但是nums是一个指向数组首元素的常量指针,不能修改,ptr可以修改
5. 数组指针和指针数组
数组指针是指向数组首元素的一个指针,指针数组是一个存放指针的数组
指针数组通常被用来表示多个字符串,相比于二维字符数组,指针数组的优点为
- 指针数组中每个元素所指的字符串不必限制在相同的字符长度
- 访问指针数组中的一个元素使用指针间接及逆行的,效率比下标方式要高
- 但是指针数组不能像二维字符数组一样通过下标修改某一元素的值
char str_list1[][128] = {"someone","like","you"}; const char *str_list2[3] = {"someone","like","you"}; cout << str_list1[0]; // someone cout << str_list2[0]; // someone
6. 指向指针的指针
指向指针的指针是一种多级间接寻址的形式,或者说是指针链,间接寻址可以扩大变量的表示范围,缺点是多级访问增加时间
一个指向指针的指针变量必须使用俩个星号进行声明
int **ptr;
同样的,想要访问这个指针最终指向的值需要两个**
7. 传递指针给函数
C++允许传递指针给函数,只需要简单的声明函数参数为指针类型即可,例子如下 (不就是指针作为参数么),同时自然也可以使用数组作为参数
#include<iostream> using namespace std;
// 写函数的时候应该习惯性的先声明函数,然后再定义函数 void getSeconds(unsigned long *par); int main(){ unsigned long sec; getSeconds( &sec ); cout << sec << endl; return 0; } void getSeconds(unsigned long *par){ *par = time(Null); return; }
Tip: 之前一直不懂为什么return 0,还有opencv好多函数没有返回值,而是需要定义变量,是因为定义函数时,首先要声明函数的返回值类型,当返回值有多个不同类型的时候,就没有办法直接返回了
8. 从函数返回指针
C++允许从函数返回指针,需要声明一个返回指针的函数,如下所示
int * getptr(){ . . . return ptr; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构