ポインタとしての配列名
CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 7/63。
C言語におけるarrayとpointerには、Cがメモリ上のdataをどのように扱うかを理解するうえで基本となる特別な関係があります。arrayをDeclareすると、array名自体がarrayのfirst elementへのconstant pointerとして機能します。
つまり、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]は、どちらもまったく同じメモリアドレスを与えます。配列名は、アドレス演算子を使わずに最初の要素のアドレスを参照するための、より便利な方法にすぎません。
この関係を理解すると、配列でポインタ技法を使えるようになり、コードをより柔軟かつ効率的にできます。重要な違いは、通常のポインタとは異なり、配列名は定数ポインタであり、指し示す対象を変更できないという点です。
チャレンジ
簡単配列名とその最初の要素へのポインターの同等性を示す C プログラムを作成してください。プログラムでは、次のことを行う必要があります。
- 4 個の要素を持つ整数配列 named
numbersを宣言し、値 {10, 20, 30, 40} で初期化する - 整数へのポインター named
ptrを宣言する - array name
numbersをポインターptrに Assign する %pformat specifier を指定したprintfを使用して、numbersに格納されているアドレスを出力する%pformat specifier を指定したprintfを使用して、First element&numbers[0]のアドレスを出力する%pformat specifier を指定したprintfを使用して、ptrに格納されているアドレスを出力する- array name を使用して First element の値を出力する:
*numbers - pointer を使用して First element の値を出力する:
*ptr
出力には、次の形式で結果を表示してください。
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10この challenge は、array name が First element への constant pointer として機能すること、および ptr に array name が Assign されると、numbers、&numbers[0]、ptr がすべて同じメモリアドレスを含むことを示します。
自分で試してみよう
#include <stdio.h>
int main() {
// TODO: ここにコードを書いてください
// 1. 配列 'numbers' を {10, 20, 30, 40} で宣言して初期化する
// 2. 'ptr' という名前の整数へのポインタを宣言する
// 3. 配列名をポインタに代入する
// 4. 必要なすべてのアドレスと値を出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ