Programming埋め込み開発者

C言語におけるポインタの配列とは何ですか?それは配列へのポインタと何が違いますか?それぞれの型をどのように宣言し、使用するのが正しいですか?

Hintsage AIアシスタントで面接を突破

答え

ポインタの配列 — 各要素が通常は同じ型のポインタを表す構造です。文字列のリストを格納するために使用されることがあります(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キューの実装でバッファのアドレスを取得する場所(配列へのポインタ)と要素を取得する場所(ブロックへのポインタの配列)を混同し、その結果ポインタのシフトが不正になり、データが失われました。