C言語 | ポインター | 配列とポインター

この記事では、ポインターで配列を参照し、各要素へアクセスする方法を説明する。

配列の間接参照

多くの式では、配列名が先頭要素のアドレスへ変換される。

int *iPo = &iArray[0];
int *iPo = iArray;

どちらの宣言も同じアドレスを保存する。ただし、配列自体は代入可能なポインター変数ではない。

コード1

#include <stdio.h>

int main() {
 char chStr[] = "Kitty on your lap";
 printf("&chStr[0] = %p, chStr = %p\n" , (void *)&chStr[0] , (void *)chStr);
 return 0;
}

配列の添字指定は、ポインター演算と間接参照に相当する。

iArray[index]
*(iArray + index)

同様に、&iArray[index]iArray + index と同等である。

コード2

#include <stdio.h>

int main() {
 int iArray[] = { 2 , 4 , 8 };
 printf("dereference = %d, %d, %d\n" , *iArray , *(iArray + 1) , *(iArray + 2));
 printf("index = %d, %d, %d\n" , iArray[0] , iArray[1] , iArray[2]);
 return 0;
}

括弧の位置は重要である。*iPo++ は間接参照後にポインターを進め、(*iPo)++ は参照先の値を増やす。

多次元配列

多次元配列も連続したメモリ領域に保存されるが、各次元は型の一部として残る。たとえば、int [2][2] には隣接した4つの整数がある。

int iArray[2][2] = { { 1 , 2 } , { 3 , 4 } };

iArray[0] は最初の行、iArray[0][0] はその先頭の整数を参照する。可能な限り、キャストで平坦化せずに次元情報を保つ。

配列を関数へ渡す

大きなデータをコピーしないように、関数は通常ポインター経由で配列を受け取る。

コード3

#include <stdio.h>

void stringToLower(char *text) {
 int index;
 for(index = 0 ; text[index] ; index++) {
   if (text[index] >= 'A' && text[index] <= 'Z')
     text[index] += 'a' - 'A';
 }
}

int main() {
 char text[] = "KITTY on YOUR lap";
 stringToLower(text);
 printf("%s\n" , text);
 return 0;
}

関数の引数では、char *textchar text[] は同じポインター型へ調整される。ポインター記法を使うと動作が明確になる。