(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]
これは、「 b30個の整数の配列へのポインタ」を意味します。
(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。bint長さの配列へのポインタ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であることを意味します。
別の変数への参照を格納する変数がポインターと呼ばれることを今見てきました。ポインタは、参照が格納されている変数を「指す」と言われます。
ポインターを使用すると、ポインターが指す変数に格納されている値に直接アクセスできます。これを行うには、ポインターの識別子の前にアスタリスク(*)を付ける必要があります。これは、間接参照演算子として機能し、文字通り「によって示される値」に変換できます。
について特別なことは何もありません(*)。型キャストで型を参照しているだけなので(その型の名前を持つ変数ではない)、単に名前を省略します。ここでも、ポインターの配列と配列へのポインターを区別するために、パラメーターが必要です。