5

(int (*)[30])Cではどういう意味ですか?たとえば、次のようになります。

int (*b)[30] = (int (*) [30]) malloc(30 * sizeof(int [20]));
4

6 に答える 6

13

大まかに言うと「ポインタ」という意味です。

int (*b)[30]

これは、「 b30個の整数の配列へのポインタ」を意味します。

(int (*) [30])

これは、「30個の整数の配列へのポインタにキャストする」ことを意味します。

于 2012-04-09T20:05:43.627 に答える
3
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); 

式のタイプ*bint [30]、なのでsizeof *b、と同じsizeof (int [30])です。

于 2012-04-09T21:07:08.860 に答える
2

C宣言と型を解析する方法:外部からでそれらをほどきます。

  • int (*b)[30]
  • (*b)[30]ですint
  • (*b)長さのint配列です30
  • bint長さの配列へのポインタ30です。

名前のないバージョンint (*) [30]は完全に同一であり、名前だけが省略されています。

Cプログラミング言語のコピーをお持ちの場合は、cdeclそのような宣言を英語に変換できるというプログラムがあります。時間の経過とともにさまざまな変更が加えられてきました。たとえば、Debianのcutilsは名前のない形式をサポートしており、cdecl.orgオンラインです。

于 2012-04-09T20:07:28.533 に答える
1

あなたはcdeclこれらの種類のものを理解するために使うことができます:

cdecl> explain (int (*) [30]) 
cast unknown_name into pointer to array 30 of int
于 2012-04-09T20:09:50.517 に答える
0

(*)変数名の前は、それがPOINTERであることを意味します。

別の変数への参照を格納する変数がポインターと呼ばれることを今見てきました。ポインタは、参照が格納されている変数を「指す」と言われます。

ポインターを使用すると、ポインターが指す変数に格納されている値に直接アクセスできます。これを行うには、ポインターの識別子の前にアスタリスク(*)を付ける必要があります。これは、間接参照演算子として機能し、文字通り「によって示される値」に変換できます。

于 2012-04-09T20:07:09.317 に答える
0

について特別なことは何もありません(*)。型キャストで型を参照しているだけなので(その型の名前を持つ変数ではない)、単に名前を省略します。ここでも、ポインターの配列と配列へのポインターを区別するために、パラメーターが必要です。

于 2012-04-09T20:09:50.470 に答える