以下のプログラムでポインタのポインタがはっきりわかりません。
私なりのコメントをいれています。間違いがありましたらご指摘おねがいします。p->next = ap; で
apは(**ap)ということですか。if (p->next != 0)以下を
わかり易く説明していただけますか。リストに次々に構造体のポインタを入れて、
p->next == 0になるとp->before = 0;にうつるとおもいますが。
どうしてこうしているのですか。さいごにap = p; は*ap がpを指すようにするということですか。というのはこれでリストに追加されたということですかね。
ここらあたりがよくわかりません。また同じような質問だと怒られそうですが
よろしくお願いします。
コード void list_add(struct address **ap,char *number, char *name, char *address, char *tel) { struct address *p; if ((p = malloc(sizeof(struct address))) != 0) { strcpy(p->number, number); strcpy(p->name, name); strcpy(p->address, address); strcpy(p->tel, tel); p->next = *ap; // *apはheadである。 if (p->next != 0) p->next->before = p; //(p->next)->before = p; pの次のメンバーのbeforeにpのアドレスを入れる。 //p->next->before などとなっています。これはポインタ型の変数 pが //さす構造体の next メンバ(これもポインタ型です)がさす //構造体の beforeメンバの値、という意味です。 //つまり (p->next)->beforeと読むのです。括弧内は、 //before メンバの値を知りたい構造体をさすポインタ値です。 //この値をどのように得るかというと、括弧内が p->next ですから、 //変数 p がさす構造体の next メンバの値、ということになります。 //next メンバの型は struct schedule* ですから、確かに値はポインタです。 //変数 p の値はstruct addressの先頭要素をさすポインタですから、 //結局、p->next->before は、先頭から 2 番目の要素(先頭の次)の //beforeメンバの値、となります。 p->before = 0; *ap = p; // *apはheadである。 } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/22 12:48