私は通常、pythonでプログラミングします。シミュレーションのパフォーマンスを向上させるために、C を学んでいます。連結リストへの追加機能を実装するときに、ポインターのポインターの使用法を理解するのに問題があります。これは、私の本 (Kanetkar による C でのポインターの理解) からのコードの抜粋です。
#include <stdlib.h>
#include <stdio.h>
struct node{
int data;
struct node *link;
};
int main(){
struct node *p; //pointer to node structure
p = NULL; //linked list is empty
append( &p,1);
return 0;
}
append( struct node **q, int num){
struct node *temp, *r; //two pointers to struct node
temp = *q;
if(*q == NULL){
temp = malloc(sizeof(struct node));
temp -> data = num;
temp -> link = NULL;
*q = temp;
}
else{
temp = *q;
while( temp -> link != NULL)
temp = temp -> link;
r = malloc(sizeof(struct node));
r -> data = num;
r -> link = NULL;
temp -> link = r;
}
}
このコードでは、ダブル ポインター **q を append 関数に渡します。これがアドレスのアドレス、つまりこの場合は NULL のアドレスであることがわかります。
なぜこのようなことをするのか、私にはわかりません。append() 関数内のすべてのものから 1 つの * 演算子を削除し、単純に NULL のアドレス (つまり、&p ではなく p) を append() 関数に渡すことは有効ではないでしょうか?
この質問をグーグルで検索しました。答えは、理解するのが難しすぎる (私は C の初心者なので) か、単純すぎるかのどちらかです。これについて読むことができるヒント、コメント、またはリンクに感謝します。