任何人都可以向我解释为什么(完整代码要遵循)为什么:
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;
}
答案 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]
。