-> 结构中的运算符

-> operator in a struct

任何人都可以向我解释为什么(遵循完整代码)为什么:

printf("%d\n", S[2].Str->Str->Var); = 8

但是

printf("%d\n", S[2].Str->Var); = 4

考虑到指针占用 8 个字节并且每个指针的地址相隔 8 个字节?

练习题的完整代码:

#include <stdio.h>
struct S {
    int Var;
    struct S *Str;
};
int main(void) {
    struct S S[] = { { 8, NULL }, { 4, &S[0] }, { 2, &S[1] } };
    //array positions: 0,0  0,1     1,0  1,1      2,0   2,1
    printf("%d\n\n", S[2]); // = 2
    printf("%d\n", S[2].Str->Str->Var); // = 8

    return 0;
}

这是因为在数组的每个元素上都分配了指针。

这么说吧:

你这里有以下内容:
每个"tuple"如下: (索引元素的地址, intValue, Str指针值);

[(@1, 8, NULL), (@2, 4, @1), (@3, 2, @2)]

下面我们一步步分析语句:

S[2].Str // is actually the element at the 1º position of the array. (0 based indexing)
S[2].Str->Str // is pointing to the first element of the array (0th position)
S[2].Str->Str->Var // is accessing the value of the first element of the array.

如你所见,struct S S[] 是一个结构数组。 可以使用 S[0]..S[i-1] 按值访问任何类型的数组,其中 i 是数组的长度。 在每个结构中,你都有一个指针和一个 integer.Think 作为指向特定数据的箭头的指针 structure.As 你可以看到一个指向特定内存的指针 location.In 这个例子你有:

{ 8, NULL }, { 4, &S[0] }, { 2, &S[1] }

在S[2]中,指针Str的值被赋值为指向S[1]的内存位置,S[1]中的str指向S[0]的内存位置。 就像穿越回来一样。

伪代码:

S[2].Str -> S[1] 
S[1].Str -> S[0]
S[0].Var = 8

S[2].Str->Str->Var = 8 

箭头 (->) 表示通过指针访问结构的值成员。

实际上数组 S 包含一个 singly-linked 列表,其头部存储在元素 S[2].

这是列表的样子

     Str       Str
S[2] ---> S[1] ---> S[0]
head

你甚至可以通过以下方式介绍名字head

struct S *head = &S[2];

所以列表包含三个节点:

head -> head->Str -> head->Str->Str
S[2] -> S[1]      -> S[0]

所以调用

printf("%d\n\n", S[2]->Var );

输出存储在节点S[2]中的值2(head)

printf("%d\n\n", S[2]->Str->Var );

输出存储在节点4中的值S[1]

printf("%d\n\n", S[2]->Str->Str->Var );

输出节点S[01]中存储的值8