C语言:数组指针分配/打印无需解引用?两段代码差异解析
数组指针下标操作的解引用问题解析
先看两段代码的差异:
无法正常运行的代码
#include <stdio.h> void main(){ int *i = (int *) malloc(12); *i[0] = 1; printf("%d", *i[0]); }
正常运行的代码
void main(){ int *i = (int *) malloc(12); i[0] = 1; printf("%d", i[0]); }
核心原因:运算符优先级与下标操作的本质
问题出在运算符优先级和数组下标操作的本质上:
- C语言中,
[]的优先级高于*,所以*i[0]会被编译器解析为*(i[0])。 i是int*类型的指针,i[0]本身等价于*(i + 0)——这已经完成了对指针i的解引用,得到的是int类型的数值,而非指针。- 对一个
int类型的值使用*(解引用操作)是非法的,因为解引用只能作用于指针类型,这就是第一段代码编译报错、无法运行的原因。
而第二段代码中:
i[0]直接代表指针i指向的第一个int元素,赋值i[0] = 1就是给这个元素写入数据;printf("%d", i[0])则是直接读取这个元素的数值,完全符合语法规则,所以能正常运行。
简单来说:数组下标操作[]本身就包含了解引用的逻辑,当你用指针模拟数组时,i[n]已经帮你完成了*(i + n)的操作,不需要额外再加*,否则反而会因为操作非指针类型而报错。
内容的提问来源于stack exchange,提问作者John Persuro
相关产品推荐
相关产品推荐

