使用指针访问结构的成员

时间:2016-08-06 16:56:33

标签: c pointers structure

我在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

3 个答案:

答案 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 *,即pointerPerson

*people的数据类型为Person,即Person数据类型。类似地,*(people + index)的数据类型也是Person

因为people[index]内部转换为*(people + index)people[index]的数据类型为Person - 而不是pointer to Person

由于people[index]的数据类型为Person,而不是pointer to Person,因此您使用.运算符访问其成员,而不是->运算符。

答案 2 :(得分:0)

因为人是一组人结构,而不是指针。如果您的数组包含指针,则需要使用箭头表示法。您可以在不使用指针和结构数组的情况下创建结构。