-> 结构中的运算符
-> 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
。
任何人都可以向我解释为什么(遵循完整代码)为什么:
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
。