ポインタとしての配列名
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 7/63。
C言語における配列とポインタには、C言語がメモリ上のデータをどのように扱うかを理解する上で非常に重要な特別な関係があります。配列を宣言すると、配列名自体が配列の最初の要素への定数ポインタとして機能します。
これは、int numbers[5]; のような配列がある場合、numbers という名前は本質的に常に numbers[0] を指すポインタであることを意味します。配列名は、別途宣言する必要のない組み込みのポインタとして考えることができます。
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' points to the first element
// numbers == &numbers[0] // これらは等価です!この等価性は極めて重要です。numbers と &numbers[0] の両方が、まったく同じメモリ address を返します。array の名前は、address-of オペレータを使用することなく first element の address を参照するための、より便利な方法にすぎません。
この関係を理解することで、配列でポインター手法を活用できるようになり、コードをより柔軟で効率的にすることができます。通常のポインターとの主な違いは、配列名は定数ポインターであるという点です。つまり、指している先を変更することはできません。
チャレンジ
簡単配列名とその最初の要素へのポインタの等価性を示すCプログラムを作成してください。プログラムは以下の手順に従う必要があります:
- 4つの要素を持つ
numbersという名前のint型配列を宣言し、値 {10, 20, 30, 40} で初期化します。 ptrという名前の整数へのpointerを宣言します。- 配列名
numbersをポインタptrに代入します。 %pフォーマット指定子を付けたprintfを使用して、numbersに格納されているアドレスを出力します。%pフォーマット指定子を付けたprintfを使用して、最初の要素のアドレス&numbers[0]を出力します。%pフォーマット指定子を付けたprintfを使用して、ptrに格納されているアドレスを出力します。- 配列名を使用して最初の要素の値を出力します:
*numbers - ポインタを使用して最初の要素の値を出力します:
*ptr
出力は以下の形式で表示する必要があります:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10このチャレンジは、配列名が最初の要素への定数ポインタとして機能すること、および ptr に配列名が代入されたときに numbers、&numbers[0]、ptr がすべて同じメモリ領域のアドレスを保持することを示します。
自分で試してみよう
#include <stdio.h>
int main() {
// TODO: ここにコードを書いてください
// 1. 配列 'numbers' を {10, 20, 30, 40} で宣言し初期化する
// 2. 'ptr' という名前の整数へのポインタを宣言する
// 3. 配列名をポインタに代入する
// 4. 必要なすべてのアドレスと値を出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。