いつもお世話になっています。C言語初心者でただいま勉強中です。構造体へのポインタのアドレスについて質問させていただきます。data[0],data[1]のアドレスを調べたいんですが、なぜかdata[0
]とdata[1]のアドレスが同じになってしまいます。どのようにすれば正しいアドレスが得られますか?教えて下さい。よろしくお願いします。以下がコードです。
C言語
1コード
#include<stdio.h> typedef struct{ int id; /* ID */ char name[20]; /* 名前 */ int score; /* 点数 */ char grade; /* 成績 */ } Record; /* 以下の構造体の初期化はmain()の中に書くこと */ int main() { int i; Record data[2]={ {1,"Aki",80,'A'}, {2,"Takero",75,'B'},};/*構造体の初期化*/ Record *p=data,*q;/*構造体へのポインタの初期化*/ for(i=0;i<2;i++){/*ポインタpがdata0,data1を表す出力*/ printf("%d\n",(*(p+i)).id); printf("%s\n",(*(p+i)).name); printf("%d\n",(*(p+i)).score); printf("%c\n",(*(p+i)).grade); printf("構造体型data[%d]のサイズは%dバイトです。\n",i,sizeof(p+i)); printf("構造体data[%d]のアドレスは%pです。\n",i,(p+i)); } for(i=0;i<2;i++){/*構造体へのポインタからそれぞれのメンバにアクセスして出力*/ printf("%d\n",(p+i)->id); printf("%s\n",(p+i)->name); printf("%d\n",(p+i)->score); printf("%c\n",(p+i)->grade); printf("構造体型data[%d]のサイズは%dバイトです。\n",i,sizeof(p+i)); printf("構造体data[%d]のアドレスは%pです。\n",i,p+i); } int z=0; for(q=p;q<p+2;q++){ /*ポインタが何も指していないところ(data0 ,data1の次の場所のところになる)までループ*/ printf("%d\n",(*q).id); printf("%s\n",(*q).name); printf("%d\n",(*q).score); printf("%c\n",(*q).grade); if(z==0){ printf("構造体型data[%d]のサイズは%dバイトです。\n",z,sizeof(q)); printf("構造体data[%d]のアドレスは%pです。\n",z,&q); } else if(z==1){ printf("構造体型data[%d]のサイズは%dバイトです。\n",z,sizeof(q)); printf("構造体data[%d]のアドレスは%pです。\n",z,&q); } z++; } int j=0; for(q=p;q<p+2;q++){ /*ポインタが何も指していないところ(data0 ,data1の次の場所のところ)までループ*/ /*構造体へのポインタからそれぞれのメンバにアクセスして出力*/ printf("%d\n",q->id); printf("%s\n",q->name); printf("%d\n",q->score); printf("%c\n",q->grade); if(j==0){ printf("構造体型data[%d]のサイズは%dバイトです。\n",j,sizeof(q)); printf("構造体data[%d]のアドレスは%pです。\n",j,&q); } else if(j==1){ printf("構造体型data[%d]のサイズは%dバイトです。\n",j,sizeof(q)); printf("構造体data[%d]のアドレスは%pです。\n",j,&q); } j++; } // for(i=0;i<2;i++){ // printf("構造体型data%dのサイズは%dバイトです。\n",i,sizeof(*p)); // } return 0; }
実行結果
1
Aki
80
A
構造体型data[0]のサイズは8バイトです。
構造体data[0]のアドレスは0x7fff4fe94bb0です。
2
Takero
75
B
構造体型data[1]のサイズは8バイトです。
構造体data[1]のアドレスは0x7fff4fe94bd0です。
1
Aki
80
A
構造体型data[0]のサイズは8バイトです。
構造体data[0]のアドレスは0x7fff4fe94bb0です。
2
Takero
75
B
構造体型data[1]のサイズは8バイトです。
構造体data[1]のアドレスは0x7fff4fe94bd0です。
1
Aki
80
A
構造体型data[0]のサイズは8バイトです。
構造体data[0]のアドレスは0x7fff4fe94b98です。
2
Takero
75
B
構造体型data[1]のサイズは8バイトです。
構造体data[1]のアドレスは0x7fff4fe94b98です。
1
Aki
80
A
構造体型data[0]のサイズは8バイトです。
構造体data[0]のアドレスは0x7fff4fe94b98です。
2
Takero
75
B
構造体型data[1]のサイズは8バイトです。
構造体data[1]のアドレスは0x7fff4fe94b98です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。