void main()
{
int (*d)[10];
d[0] = 7;
d[1]=10;
printf("%d\n",*d);
}
印刷する必要があります10
が、コンパイラは次のようなエラーを示しています。
test.c:4:7:エラー:タイプ'int'からタイプ'int[10]'に割り当てるときに互換性のないタイプ</p>
すべてではなく、いくつかのエラーを含めたことに注意してください。
chris が指摘したように、d
はarrayへのポインタです。これは、変数にアクセスするときに変数を不適切に使用することを意味しますが、有効な配列を指すように代入しない限り、ランダム メモリにアクセスすることにもなります。d
プログラムを次のように変更します。
int main(void)
{
int (*d)[10]; /* A pointer to an array */
int a[10]; /* The actual array */
d = &a; /* Make `d` point to `a` */
/* Use the pointer dereference operator (unary prefix `*`)
to access the actual array `d` points to */
(*d)[0] = 7;
(*d)[1] = 10;
/* Double dereference is okay to access the first element of the
arrat `d` points to */
printf("%d\n", **d);
return 0;
}
C では、[] はポインター構文の * と同じです。したがって、次の行は同じです。
int** array2d1;
int* array2d2[];
int array2d3[][];
より近い例に関連するために、メイン関数には次の一般的な形式があります。
int main(int argc, char** argv){ ... }
また
int main(int argc, char* argv[]){ ... }
したがって
int (*d)[10]
と同じです
int* d[10]
これはと同じです
int** d;
int firstArray[10];
d = &firstArray;
事実上、ポインター (配列へのポインター) へのポインターを作成し、最初のポインターを 10 要素の配列に割り当てます。したがって、次の行を実行すると:
d[0] = 7;
d[1] = 10;
1 番目の配列のアドレスを 7 に、2 番目の配列のアドレスを 10 に割り当てています。Joachim が述べたように、値を割り当てるには、2 回参照する必要があります。
(*d)[0] = 7
(*d)[1] = 10
これは、「d が指す値の 0 番目のインデックスに 7 を割り当てる」と言っています。それが理にかなっていることを願っていますか?
d
10 個の int の配列へのポインタです。
int (*d)[10]
10 個の整数の配列へのポイントの宣言です。
対。
int *d[10]
、これは 10 個の int ポインターの配列です。
このようなより複雑な構文 (通常はポインターを含む) については、cdeclを使用してデコードします。
この形式で使用されますintd[10]
dは「一種のポインタ」である必要があると誤解されていると思います。そのため、dの前に*を付けます。しかし、それはあなたが望むものではありません。整数の配列に名前を付けたいと思います。その表記法は上に表示されています。
C では、ポインタの概念が混乱することがあります。
配列を検討するint d[6] = {0,1,2,3,4,5}
その場合、*d は d[0] に相当します。d はそれ自体が配列へのポインターであり、*d はそのポインターを逆参照して値を返します。
したがって、次のコードは同じ値を出力します。
int main()
{
int (d)[10];
*d = 7;
*(d + 1)=10;
printf("%d\n",*d);
printf("%d\n",d[0]);
return 0;
}
結果:
7
7
http://codepad.org/LYY9ig1iを参照してください。
次のようにコードを変更した場合:
#include<malloc.h>
int main()
{
int *d[10]; //not (*d)[10]
d[0] = (int *)malloc(sizeof(int *) * 10);
d[0][0] = 7;
printf("%d\n",d[0][0]);
return 0;
}
これがお役に立てば幸いです!