You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:22:46