配列要素とポインタ
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 8/63。
配列名がポインタとしてどのように機能するかを理解したところで、この知識を利用して、まったく異なる方法で配列要素にアクセスできます。array[i] のようなおなじみのブラケット記法を使用する代わりに、ポインタ記法を使用して同じ結果を得ることができます。
重要な洞察は、array[i] は *(array + i) と完全に同等であるということです。array + i と記述すると、Cに対して配列の先頭から i 位置分進むように指示していることになります。その後、デリファレンス演算子 * がその場所にある値を取得します。
int numbers[5] = {10, 20, 30, 40, 50};
// 次の2行は、まったく同じことを行います:
printf("%d", numbers[2]); // 30を出力します
printf("%d", *(numbers + 2)); // これも30を出力しますこのポインタ表記が機能するのは、C言語がデータ型のサイズに基づいて正しいメモリ・アドレスを自動的に計算するためです。整数配列のポインタに2を加算すると、C言語は 2 × sizeof(int) バイト分だけ進み、正確に3番目の要素に到達します。
この等価性を理解することで、配列の扱い方に柔軟性が生まれ、C言語の学習を進める中で出会うことになる、より高度なポインタ技術への準備が整います。
チャレンジ
簡単従来の配列インデックスの代わりにポインタ表記を使用して配列要素にアクセスする方法を示すCプログラムを作成してください。プログラムの内容は以下の通りです:
- 6つの要素を持つ
valuesという名前の整数配列を宣言し、{5, 15, 25, 35, 45, 55}という値で初期化します。 - forループを使用して、配列のすべての要素を反復処理します。
- ループ内では、ポインタ表記
*(values + i)を使用して各要素にアクセスします(values[i]のようなブラケット表記は使用しないでください)。 - ポインタ表記によるアクセス方法を使用して、各要素を出力します。
- ループの後、両方のメソッドを使用して3番目の要素(インデックス2)を出力し、等価であることを示します:
- 最初にポインタ表記を使用:
*(values + 2) - 次に従来の配列表記を使用:
values[2]
- 最初にポインタ表記を使用:
出力は以下の形式で結果を表示する必要があります:
Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25このチャレンジでは、array[i] と *(array + i) の等価性についての理解をテストし、ポインタ演算によって従来のインデックス作成の代わりにメモリアドレス計算を使用して配列要素にアクセスする方法を示します。
チートシート
配列の要素は、ブラケット表記の代わりにポインタ表記を使用してアクセスできます。式 array[i] は *(array + i) と等価です。
array + i と記述すると、C言語は配列の先頭から i ポジション分だけ進みます。デリファレンス演算子 * は、その場所にある値を取得します。
int numbers[5] = {10, 20, 30, 40, 50};
// これらの2行は、まったく同じことを行います:
printf("%d", numbers[2]); // 30を出力します
printf("%d", *(numbers + 2)); // これも30を出力しますC言語は、データ型のサイズに基づいて正しいメモリ番地を自動的に計算します。整数配列のポインタに2を加算すると、2 × sizeof(int) バイト分だけ進みます。
自分で試してみよう
#include <stdio.h>
int main() {
// TODO: ここにコードを記述してください
// 6つの要素を持つ配列 'values' を宣言し、初期化します
// forループを使用して、ポインタ表記 *(values + i) で各要素を出力します
// ループの後、ポインタ表記と配列表記の両方を使用して3番目の要素を出力します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。