ポインタの配列 — 各要素が通常は同じ型のポインタを表す構造です。文字列のリストを格納するために使用されることがあります(char *arr[];)。
配列へのポインタ — 配列全体の最初のアドレスを格納する変数です(例:int (*ptr)[10];は10個のint要素の配列を指します)。
例:
// charのポインタの配列(文字列の配列) char *days[] = {"Sun", "Mon", "Tue"}; // 10個の整数の配列へのポインタ int arr[10]; int (*p)[10] = &arr; // アクセス: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]
"
char *arr[3];とchar (*arr)[3];の違いは何ですか?各場合で文字列にどのようにアクセスすればよいですか?"
多くの人は、違いがないか、単なる同義語だと考えています。
正しい答え:
char *arr[3]; — charのポインタの配列(通常は文字列の配列)。char (*arr)[3]; — 3つのcharの配列へのポインタ(長さ3の単一ブロックの文字列へのポインタ)。char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z
物語1
メニュー用の文字列の配列を作成しようとしたが、char menu[5][30];と書き、関数にchar *menuとして渡してしまったため、その関数は最初の文字列のみを扱い、残りは破損したりプログラムがクラッシュした。
物語2
配列の配列へのポインタを作成しようとしたが、int *arr[10];をループで初期化し、実際にはローカル配列のポインタを格納し、アクセスした際に不定動作を引き起こしました。
物語3
FIFOキューの実装でバッファのアドレスを取得する場所(配列へのポインタ)と要素を取得する場所(ブロックへのポインタの配列)を混同し、その結果ポインタのシフトが不正になり、データが失われました。