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 *text と char text[] は同じポインター型へ調整される。ポインター記法を使うと動作が明確になる。