我在gcc(x64)上编译了下面的代码。
为什么我可以通过点(人[0] .name)而不是' - >'来访问结构项?
不是人[0]指向结构的地址,我应该使用人物[0] - >名称或(*人[0])。名称来访问名称?
代码:
#include <stdio.h>
#define TOTAL 4
int main(void) {
typedef struct tagPerson {
char name[12];
int ID;
} Person;
#define LPPERSON Person*
Person * people = calloc(sizeof(Person), TOTAL);
strncpy(people[0].name, "Henry", 12);
strncpy(people[1].name, "Jacob", 12);
printf("sizeof(people)=%d\n", sizeof(people));
printf("people[0].name=%s\n", people[0].name);
printf("sizeof(people[0])=%d\n", sizeof(people[0]));
printf("people[1].name=%s\n", people[1].name);
printf("sizeof(people[1])=%d\n", sizeof(people[1]));
free(people);
return 0;
}
输出:
sizeof(people)=8
people[0].name=Henry
sizeof(people[0])=16
people[1].name=Jacob
sizeof(people[1])=16
答案 0 :(得分:2)
people
是指向Person
的指针。 E1[E2]
是一个数组下标操作,等于*((E1) + (E2))
(6.5.2.1)。这里E1
必须是指向T的指针,E2
必须是整数类型。整个表达式的类型只是T.在您的情况下,E1
是指向Person
的指针,因此people[0]
的类型为Person
,并且通过{{进行字段访问1}}而不是.
。
如果您想使用箭头 - 您可以通过以下方式执行此操作:
->
答案 1 :(得分:1)
Person * people
表示:
people
的数据类型为Person *
,即pointer
到Person
。
和
*people
的数据类型为Person
,即Person
数据类型。类似地,*(people + index)
的数据类型也是Person
。
因为people[index]
内部转换为*(people + index)
,people[index]
的数据类型为Person
- 而不是pointer to Person
。
由于people[index]
的数据类型为Person
,而不是pointer to Person
,因此您使用.
运算符访问其成员,而不是->
运算符。
答案 2 :(得分:0)
因为人是一组人结构,而不是指针。如果您的数组包含指针,则需要使用箭头表示法。您可以在不使用指针和结构数组的情况下创建结构。