FEATURED · 精选文章

C/C++指针核心知识回顾总结(一)

发布时间 / 2026/8/29 18:10:53
来源 / 创域科博编辑部
栏目 / 资讯中心
C/C++指针核心知识回顾总结(一) C/C指针核心知识总结从内存地址到安全传参一、先建立一个核心模型指针就是地址值的载体计算机内存通常按字节编址每个字节单元都有唯一编号这个编号就是地址。C 语言中的指针变量就是专门保存地址的变量。用于取地址*用于解引用通过指针保存的地址找到目标对象。#includestdio.hintmain(void){inta10;int*pa;printf(a %d\n,a);printf(address %p\n,(void*)a);printf(through pointer %d\n,*p);*p20;printf(a %d\n,a);return0;}注意打印地址应使用%p并将地址转换为void *。地址的具体数值由平台和运行时决定不应写死。二、指针大小和指针类型不是一回事在常见平台上32 位程序的指针通常占 4 字节64 位程序的指针通常占 8 字节。同一平台上char *、int *、double *通常等宽但指针类型依然非常重要它决定编译器如何解释目标内存。1. 指针类型决定解引用尺度char *解引用通常访问 1 个字节int *解引用则按int的大小访问。也就是说类型决定了一次读写的“权限范围”。2. 指针加减按元素步进p 1不是地址数值简单加 1而是向后移动一个所指向元素的大小char *通常前进 1 字节int *通常前进sizeof(int)字节double *通常前进sizeof(double)字节。数组连续存储因此可以用指针遍历数组intarr[]{1,2,3,4,5};intsize(int)(sizeof(arr)/sizeof(arr[0]));for(int*parr;parrsize;p){printf(%d ,*p);}两个指针相减表示它们之间相差多少个元素通常用于计算数组区间长度。arr size是尾后指针可以比较不能解引用。三、void *通用地址但不是万能指针void *可以接收任意对象类型的地址常用于通用接口。在 C 中它不能直接解引用也不能直接按元素进行指针运算使用前要转换回正确的类型。voidprint_int(constvoid*data){constint*p(constint*)data;printf(%d\n,*p);}在 C 中建议使用更明确的类型设计和显式转换不要把void *当作类型安全的替代品。四、const修饰指针左管内容右管指针声明约束对象允许的操作int *p无 const 限制可改*p可改pconst int *p指向的内容不可通过p改内容可改p的指向int *const p指针变量本身可改内容不可改p的指向const int *const p内容和指针两者都不能改阅读技巧先找到变量名再向两侧看。const在*左边约束目标内容在*右边约束指针变量。不要通过错误的指针类型去修改const对象。修改 const 对象会产生未定义行为不能把“编译器暂时没报错”当成正确性证明。五、野指针最常见的三个来源局部指针未初始化int *p;中的p可能是随机值。指针越界走出数组或动态内存的有效边界后还继续读写。指向的空间已经失效例如返回局部变量地址函数结束后局部对象的生命周期已经结束。int*bad_function(void){intlocal100;returnlocal;// 错误返回失效的局部地址}安全习惯能确定指向哪里就立即初始化为地址不知道目标时初始化为NULL使用前检查有效性不再使用时可置空严格控制数组边界和对象生命周期。C 代码优先使用nullptr。六、assert把“必须成立”的条件写出来assert定义在assert.h中。条件为真时继续条件为假时输出错误信息并终止程序。它适合在 Debug 版本中捕捉程序员错误。#includeassert.h#includestddef.hsize_tmy_strlen(constchar*str){assert(str!NULL);size_tcount0;while(*str!\0){count;str;}returncount;}定义NDEBUG后assert通常会被禁用。因此不要把有副作用的业务逻辑放进 assert 表达式。七、传值调用与传址调用C 的参数传递是传值。下面的函数只交换了形参副本voidswap_wrong(intx,inty){inttmpx;xy;ytmp;}如果函数需要修改调用者中的变量就传入地址voidswap_int(int*px,int*py){inttmp*px;*px*py;*pytmp;}intmain(void){inta3;intb5;swap_int(a,b);}传值适合只依赖输入值的计算传址适合需要修改调用者对象或避免复制较大对象的场景。八、最后的四问自检法每次看到*p先问p是否初始化p是否为NULL/nullptrp指向的对象是否仍在有效生命周期内指针是否落在合法边界内并且目标空间足够大把这四个问题变成习惯指针代码的稳定性会明显提高。编译建议GCC 可以开启警告和调试信息gcc-Wall-Wextra-gpointer_demo.c-opointer_demo警告不是错误的替代品但它能尽早暴露类型不匹配、未使用变量和可疑表达式。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻