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

为何访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:48:38