現在、とあるC言語入門書に載っている下記の『自己参照構造体(チェイン)』のプログラムが理解できず、
悩んでいます。
ポインタによるアドレス・関数の受け渡しや制御文の意味などは理解でき、実際に記述してコンパイル→実行もできたのですが、どうしてもこのプログラムの41行目にある
for(wp=start; wp->next != NULL; wp = wp->next)
という部分が理解できません。
wp は start のアドレスを示しており、start->next は NULL の筈なのに、どうしてこの for文 が何の問題もなく実行されるのでしょうか?
何方か、分かりやすい説明をお願いします。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct person { char name[30]; int age; struct person *next; }; main() { struct person dmy; struct person *start=&dmy; struct person *wkdata; struct person *wp; char name[30]=" ",buf[10]; int tosi; start=&dmy; start->next=NULL; while(1){ printf("名前="); gets(name); if(strcmp(name,"") == 0) break; printf("年齢="); gets(buf); tosi=atoi(buf); wkdata=(struct person *)malloc(sizeof(struct person)); if(wkdata==NULL){ printf("メモリ確保できません.\n"); exit(1); } strcpy(wkdata->name,name); wkdata->age = tosi; for(wp=start; wp->next != NULL; wp = wp->next){ if(tosi < wp->next->age){ wkdata->next = wp->next; wp->next = wkdata; break; } } if(wp->next == NULL){ wkdata->next = NULL; wp->next = wkdata; } } for(wp = start->next; wp != NULL; wp = wp->next){ printf("%s %d\n",wp->name,wp->age); } }