web-dev-qa-db-ja.com

C変数宣言の括弧はどういう意味ですか?

誰かがこれが何を意味するのか説明できますか?

int (*data[2])[2];
 _
31
Andrew

括弧は?

C括弧[]では、アスタリスクよりも優先順位が高い

Wikipediaからの良い説明:

変数を配列へのポインタとして宣言するには、括弧を使用しなければなりません。これは、Cブラケット([])ではアスタリスク(*)よりも優先順位が高いためです。そのため、アレイへのポインタを宣言したい場合は、これをオーバーライドするように括弧を供給する必要があります。

double (*elephant)[20];
 _

これは、象がポインタであることを宣言し、それが指す型は20個の二重値の配列です。

ポインタの配列へのポインタを宣言するには、単に表記法を組み合わせます。

int *(*crocodile)[15];
 _

source

とあなたの実際のケース:

int (*data[2])[5];
 _

データは2つの要素の配列です。各要素には5 intの配列へのポインタが含まれています。

だからあなたはあなたの「データ」タイプを使ってコードを入れることができます:

int (*data[2])[5];
int x1[5];
data[0] = &x1;
data[1] = &x1;

data[2] = &x1;//<--- out of bounds, crash data has no 3rd element
int y1[10];
data[0] = &y1;//<--- compiling error, each element of data must point to an int[5] not an int[10]
 _
40
Brian R. Bondy

Linux/Unixでダウンロードすることができる「CDECL」と呼ばれる非常にクールなプログラムがあり、おそらくWindowsも同様に。 C(C++ DECLを使用する場合はC++)変数宣言を貼り付けて、単純な単語で綴ります。

15
Paul Tomblin

あなたが読み方を知っている場合 cでは、複雑な宣言を読むことから一歩先です。

何の

char *p;
 _

本当に意味?だということだ *pはcharです。何の

int (*data[2])[5];
 _

平均?だということだ (*data[x])[y]はint(0≦x <2と0≦y <5)です。今、その意味の意味について考えるだけです。 dataの配列は2 ... 5 ...整数の配列です。

あなたはそれがとても優雅だと思いませんか?あなたがしているのは式の種類を述べています。それを把握したら、宣言は二度とあなたを脅迫することは決してないでしょう!

「クイックルール」は、変数名から始めて、aを押すまで右にスキャンすることです)、変数名に戻って、(括弧のペアの「ステップアウト」になるまで左にスキャンします。そしてそのプロセスを繰り返します。

ばかげて何かに適用しましょう:

void **(*(*weird)[6])(char, int);
 _

weirdは、charとintを引数として受け入れる関数の6つのポインタの配列へのポインタと、それぞれがポインタを無効にします。

それが何であるか知っていて、それがどのようにして行われているのか知っています...- そうしないそれを行います。宣言をより管理できるチャンクに分割するにはTypedefsを使用してください。例えば。

typedef void **(*sillyFunction)(char, int);

sillyFunction (*weird)[6];
 _
5
Artelius