構造体内のポインタ
メニューを表示するにはスワイプしてください
スタック、連結リスト、木構造などの基本的なデータ構造は、要素間の接続や関係を作成するために、同じ型の他のオブジェクトへの参照を含むことができます。データ構造については、このコースの後半で解説します。
このようなデータ構造の要素は、通常「ノード」と呼ばれます。
同じ型のフィールドを自身の構造体内に含めようとすると、エラーが発生します:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
この場合、そのような構造体のサイズを決定する際に無限再帰が発生します。
この考え方は、構造体へのポインタを使うことで実現できます:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
このコードが動作する理由は、コンパイラがポインタの正確なサイズ(通常はシステムによって4バイトまたは8バイト)を知っているためです。
コンパイラはネストされた構造体全体のサイズを計算しようとはせず、単にその参照(address)を格納します。
実際にどのように動作するかを見てみましょう。
main.c
1234567891011121314151617181920212223242526#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }
struct Node kate = { "Kate" }; - 構造体初期化子で next フィールドが明示的に初期化されていない場合、標準値であるヌルポインタ(NULL)に自動的に初期化されます。これは、ポインタがどのオブジェクトも指していないときの標準値です。
while (pointer != NULL) - このループは、ポインタが NULL アドレスを指すまで実行されます。
CやC++などのプログラミング言語では、NULL のポインタは通常、リスト(または他のデータ構造)の終端を意味します。そのため、このループは pointer が NULL になるまで実行され、リストやデータ構造の終端に到達したと解釈できます。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください