(int (*)[30])
Cではどういう意味ですか?たとえば、次のようになります。
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
(int (*)[30])
Cではどういう意味ですか?たとえば、次のようになります。
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
大まかに言うと「ポインタ」という意味です。
int (*b)[30]
これは、「 b
30個の整数の配列へのポインタ」を意味します。
(int (*) [30])
これは、「30個の整数の配列へのポインタにキャストする」ことを意味します。
int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
それを分解する:
b -- b
(*b) -- is a pointer
(*b)[30] -- to a 30-element array
int (*b)[30] -- of int.
宣言と式の両方で、のような接尾辞演算子は、の[]
ような単項演算子よりも優先順位が高い*
ため、 ;T *a[]
として解釈されます。T *(a[])
IOWa
は、へのポインタの配列ですT
。配列へa
のポインタとして指定するには、グループ化を強制する必要があります。 T (*a)[]
同様に、キャスト式(int (*) [30])
は「によって返されたポインタ値malloc
を30要素の配列へのポインタとして扱う」ことを意味しますint
。技術的に言えば、キャスト式は不要であり、削除する必要があることに注意してください。
malloc
呼び出し自体は非常に間違っているようです。の20要素配列の30個のインスタンスを割り当てていますが、結果を;int
の30要素配列へのポインターに割り当てています。int
それは問題を引き起こすでしょう。のNx30行列を割り当てようとしているとするとint
、次の方が安全です。
int (*b)[30] = malloc(N * sizeof *b);
式のタイプ*b
はint [30]
、なのでsizeof *b
、と同じsizeof (int [30])
です。
C宣言と型を解析する方法:外部からでそれらをほどきます。
int (*b)[30]
。(*b)[30]
ですint
。(*b)
長さのint
配列です30
。b
int
長さの配列へのポインタ30
です。名前のないバージョンint (*) [30]
は完全に同一であり、名前だけが省略されています。
Cプログラミング言語のコピーをお持ちの場合は、cdecl
そのような宣言を英語に変換できるというプログラムがあります。時間の経過とともにさまざまな変更が加えられてきました。たとえば、Debianのcutilsは名前のない形式をサポートしており、cdecl.orgはオンラインです。
あなたはcdecl
これらの種類のものを理解するために使うことができます:
cdecl> explain (int (*) [30])
cast unknown_name into pointer to array 30 of int
(*)変数名の前は、それがPOINTERであることを意味します。
別の変数への参照を格納する変数がポインターと呼ばれることを今見てきました。ポインタは、参照が格納されている変数を「指す」と言われます。
ポインターを使用すると、ポインターが指す変数に格納されている値に直接アクセスできます。これを行うには、ポインターの識別子の前にアスタリスク(*)を付ける必要があります。これは、間接参照演算子として機能し、文字通り「によって示される値」に変換できます。
について特別なことは何もありません(*)
。型キャストで型を参照しているだけなので(その型の名前を持つ変数ではない)、単に名前を省略します。ここでも、ポインターの配列と配列へのポインターを区別するために、パラメーターが必要です。