配列への C ポインター/ポインターの配列のあいまいさの解消

int* arr[8]; // An array of int pointers.
int (*arr)[8]; // A pointer to an array of integers

3 番目は 1 番目と同じです。

一般的な規則は、演算子の優先順位です。関数ポインターが登場すると、さらに複雑になる可能性があります。


K&R が提案する cdecl プログラムを使用してください。

$ cdecl
Type `help' or `?' for help
cdecl> explain int* arr1[8];
declare arr1 as array 8 of pointer to int
cdecl> explain int (*arr2)[8]
declare arr2 as pointer to array 8 of int
cdecl> explain int *(arr3[8])
declare arr3 as array 8 of pointer to int
cdecl>

他の方法でも機能します。

cdecl> declare x as pointer to function(void) returning pointer to float
float *(*x)(void )

正式な名前があるかどうかはわかりませんが、Right-Left Thingy(TM) と呼んでいます。

変数から始めて、右、左、右... と続きます。

int* arr1[8];

arr1 整数への 8 つのポインターの配列です。

int (*arr2)[8];

arr2 8 つの整数の配列へのポインタ (括弧ブロックは左右) です。

int *(arr3[8]);

arr3 整数への 8 つのポインターの配列です。

これは、複雑な宣言を行う際に役立ちます。