2016-08-06 21 views
3

以下のコードをgcc(x64)でコンパイルしました。ポインタを使って構造体のメンバにアクセスする

「 - >」ではなく、ドット(people [0] .name)を入れて構造アイテムにアクセスするのはなぜですか?

people [0]は構造体のアドレスを指していないので、people [0] - > nameまたは(* people [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 
+2

あなたはhttp://en.cppreference.com/([ 'calloc']に呼び出しの引数を切り替えていますw/c /メモリ/ calloc)。 –

+0

callocは、割り当てられたメモリの最下位バイトへのポインタのみを返しますか? – graceshirts

+0

'strncpy()'の使用は危険です。 (よく、* strncpy()の使用はすべて危険です...) – wildplasser

答えて

2

peoplePersonへのポインタです。 E1[E2]は配列添字演算であり、*((E1) + (E2))(6.5.2.1)に等しい。ここでE1はTへのポインタでなければならず、E2は整数型でなければなりません。あなたのケースではE1Personへのポインタなのでpeople[0]Personの型を持ち、フィールドへのアクセスは->ではなく.で実行されます。

は、矢印を使用したい場合 - あなたは次の方法でそれを行うことができます。

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

人は、人の構造体ではなく、ポインタの配列であるため。配列にポインタが含まれている場合は、矢印の表記法を使用する必要があります。ポインタや構造体の配列を使わずに構造体を作成することができます。 people

データ・タイプは、即ちpointerPersonPerson *ある:

+0

変数 'people'は配列ではありませんが、1つとして使用できるメモリを指しています。 –

+0

それは本当です。配列全体にも当てはまるので、その区別がどれほど有用かはわかりません。 – bpachev

1

Person * peopleがあることを意味します。

と;

データタイプ*peopleは、Person、つまりPersonデータ型です。同様のデータ型の*(people + index)Personです。

そしてので、people[index]は内部*(people + index)に変換され、people[index]のデータ型はPersonある - とNOT pointer to Personpeople[index]以来

は、データ型Personのではなく、pointer to Personは、あなたがその.演算子を使用してメンバー、およびNOT ->オペレータにアクセスします。

関連する問題