誰かがこれが何を意味するのか説明できますか?
int (*data[2])[2];
_
括弧は?
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]
_
Linux/Unixでダウンロードすることができる「CDECL」と呼ばれる非常にクールなプログラムがあり、おそらくWindowsも同様に。 C(C++ DECLを使用する場合はC++)変数宣言を貼り付けて、単純な単語で綴ります。
あなたが読み方を知っている場合式 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];
_