为何访问retPtr1需用一元运算符*,数组指针retPtr则无需?
问题解答
代码示例
#include <stdio.h> #include <stdlib.h> int main() { int* retPtr = (int*)malloc(sizeof(int)*2); retPtr[0] = 0; retPtr[1] = 1; printf("%d\t%d",retPtr[0],retPtr[1]); int* retPtr1 = (int*)malloc(sizeof(int)); *retPtr1 = 1; printf("\n%d",*retPtr1); return 0; }
问题解析
核心原因是数组下标运算符[]本质是指针解引用的语法糖,C语言明确规定:a[i]等价于*(a + i),这个规则对数组名和指针变量都适用。
具体到你的代码:
- 对于
retPtr:retPtr[0]等价于*(retPtr + 0),retPtr[1]等价于*(retPtr + 1)——[]已经帮你完成了「指针偏移地址+解引用」的操作,所以不需要额外加*。 - 对于
retPtr1:它指向单个int的内存,*retPtr1是显式解引用指针获取值。你完全可以用retPtr1[0]代替*retPtr1,两者效果完全一样,因为retPtr1[0]就是*(retPtr1 + 0),也就是*retPtr1。
简单总结:
[]是C语言提供的便捷写法,把指针偏移和解引用合并成一步,所以用下标访问时不用再加*;- 直接用
*是显式解引用操作,当只需要访问指针指向的第一个元素(或单个元素)时,两种写法任选,只是表达形式不同。
内容的提问来源于stack exchange,提问作者Gaurav Shende
相关产品推荐
相关产品推荐

