- >结构中的运算符

时间:2018-04-05 11:02:48

标签: c pointers struct operator-keyword

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

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

3 个答案:

答案 0 :(得分:2)

正如您所见,struct S S []是一个结构数组。 可以通过S [0]的值访问任何类型的数组.S [i-1]其中i是数组的长度。 在每个结构中,你有一个指针和一个整数。将指针作为箭头指向特定的数据结构。你可以看到一个指向特定内存位置的指针。在这个例子中你有:

{ 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 

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

答案 1 :(得分:0)

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

我们这样说吧:

您在此处拥有以下内容:
每个“元组”如下: (索引元素的地址,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.

答案 2 :(得分:0)

实际上,数组S包含一个单链表,其头部存储在元素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 );

输出存储在节点2(头部)

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

输出节点4

中存储的值S[1]
printf("%d\n\n", S[2]->Str->Str->Var );

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