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

为何f1->nest[0].c可访问结构体成员?C语言指针技术疑问

关于C语言指针下标访问结构体成员的疑问解答
#include<stdio.h>
#include<stdlib.h>

struct boo
{
    int c;
    int d;
};

struct foo
{
    struct boo *nest;
    int a;
    int b;
};

int main() {
   struct foo *f1, f2;
   f1 = (struct foo*) malloc(sizeof(struct foo));
   
   f1->nest = (struct boo*)malloc(sizeof(struct boo));
   
   f1->a = 10;
   f1->b = 5;
   f1->nest->c=50;
   f1->nest->d=42;
   
   printf("%d, %d\n", f1->nest[0].c, f1->nest[0].d);
   //50, 42
   printf("%d, %d\n", f1->nest->c, f1->nest->d);
   //50, 42
   
}
  • C语言里指针和数组的语法是互通的,ptr[n]的本质等价于*(ptr + n),这是语言的核心语法规则之一。
  • f1->nest是指向struct boo类型的指针,f1->nest[0]就等于*(f1->nest + 0),也就是直接解引用该指针,得到它指向的完整struct boo结构体实例,而非你误以为的“第一个字节的值”。
  • 既然f1->nest[0]是一个struct boo对象,自然可以通过.c来访问它的成员。
  • 实际上,f1->nest[0].c、(*f1->nest).c、f1->nest->c这三种写法完全等价,都是在访问指针指向的结构体中的c成员。

内容的提问来源于stack exchange,提问作者Still a learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:05:23