为何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
相关产品推荐
相关产品推荐

