Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 構造体内のポインタ | ポインタと構造体の操作
C構造体

構造体内のポインタ

メニューを表示するにはスワイプしてください

スタック連結リスト木構造などの基本的なデータ構造は、要素間の接続や関係を作成するために、同じ型の他のオブジェクトへの参照を含むことができます。データ構造については、このコースの後半で解説します。

Note
注記

このようなデータ構造の要素は、通常「ノード」と呼ばれます。

データ構造

同じ型のフィールドを自身の構造体内に含めようとすると、エラーが発生します:

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

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 アドレスを指すまで実行されます。

Note
注意

CやC++などのプログラミング言語では、NULL のポインタは通常、リスト(または他のデータ構造)の終端を意味します。そのため、このループは pointer が NULL になるまで実行され、リストやデータ構造の終端に到達したと解釈できます。

question mark

なぜ自分自身を含む構造体を作成できないのですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  3

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  3
some-alt