繁体   English   中英

使用指针访问结构

[英]accessing struct using pointers

#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
   
}

为什么 f1->nest[0].c 工作? 根据我的理解 f1->nest,nest 是指向 struct boo 的指针。 nest[0] 将返回 nest 指向的地址的第一个字节中的值,对吗? .c如何访问会员?

[]运算符可用于任何指针。 arr[i] 100% 等同于*((arr) + (i))因此在两行之间, +运算符实际上是用于指针运算的运算符。

阅读加法运算符,然后 C17 6.5.6/7 说:

出于这些运算符的目的,指向不是数组元素的 object 的指针的行为与指向长度为 object 的类型作为其元素类型的数组的第一个元素的指针的行为相同。

这意味着我们总是可以使用任何 object 指针来执行指针运算,例如ptr + n ...当只有一个 object 而不是数组时,这不是很有意义。 我们还是不能越界访问这个单object。

尽管由于前面解释了指针算法和[]运算符之间的等价性,但这也意味着我们始终可以执行arr[0]来取消引用任何 object 指针,无论它是否为数组。


nest[0] 将返回 nest 指向的地址的第一个字节中的值,对吗?

不,它将返回第一个 struct的值,在一个单一结构的列表中。 它与编写更晦涩的(*(f1->nest + 0)).c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM