2016-08-06 66 views
3

我在gcc(x64)上編譯了下面的代碼。使用指針訪問結構的成員

爲什麼我可以通過放置點(people [0] .name)而不是' - >'來訪問結構項?

是不是人[0]指向結構的地址,我應該使用people [0] - > name或(* people [0])。name來訪問該名稱?

代碼:

#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 
+2

您已切換的參數在調用['calloc'](http://en.cppreference.com/ W/C /存儲器/釋放calloc)。 –

+0

是不是calloc只返回指向分配內存中最低字節的指針? – graceshirts

+0

您使用'strncpy()'是危險的。 (好,*每使用strncpy()都是危險的......) – wildplasser

回答

2

people是指向Person的指針。 E1[E2]是一個數組下標操作,即等於*((E1) + (E2))(6.5.2.1)。這裏的E1必須是指向T的指針,並且E2必須是整數類型。整個表達式的類型只是T.在您的情況下,E1是指向Person的指針,因此people[0]的類型爲Person,並且通過.而不是->訪問字段。

如果你想使用箭頭 - 你可以做到這一點在接下來的方式:

(people + 1)->name; /* the same as people[1].name */ 
0

因爲人是人的結構,而不是一個指針數組。如果你的數組包含指針,你需要使用箭頭符號。您可以創建不使用指針的結構和結構數組。

+0

變量'people'不是一個數組,但它指向可以作​​爲一個使用的內存。 –

+0

這是真的。一般來說,數組也是如此,所以我不知道這個區別有多大幫助。 – bpachev

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,您可以訪問使用.運營商成員,而不是->操作。