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