web-dev-qa-db-ja.com

「整数の配列へのポインタ」を初期化する

 int (*a)[5];

上記の5つの整数の配列へのポインターを初期化する方法を教えてください。

以下の式は正しいですか?

int (*a)[3]={11,2,3,5,6}; 
15
EnterKEY

長さ5のintの配列があるとします。

int x[5];

その後、a = &x;を行うことができます

 int x[5] = {1};
 int (*a)[5] = &x;

配列の要素にアクセスするには:(*a)[i](== (*(&x))[i] == (*&x)[i] == x[i][]演算子の優先順位が*より高いため、括弧が必要です。 (よくある間違いの1つは、*a[i]を実行して配列の要素にアクセスすることです)。

質問の内容がコンパイル時エラーであることを理解してください。

int (*a)[3] = {11, 2, 3, 5, 6}; 

{11,2,3,5,6}int a[5];に割り当てることができ、int (*a)[3]に割り当てるため、これも正しくなく、型の不一致もあります。

さらに、

1次元に対して次のようなことができます。

int *why = (int p[2]) {1,2};

同様に、2次元の場合は、これを試してください(ありがとう@ caf ):

int (*a)[5] = (int p[][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } };
16
Grijesh Chauhan

{11,2,3,5,6}初期化子リストであり、配列ではないため、それを指すことはできません。配列ポインターは、有効なメモリー位置を持つ配列を指す必要があります。配列が名前付き変数であるか、割り当てられたメモリのチャンクであるかは関係ありません。

それはすべて、必要な配列のタイプに要約されます。目的に応じて、Cで配列を宣言するさまざまな方法があります。

// plain array, fixed size, can be allocated in any scope
int array[5] = {11,2,3,5,6};
int (*a)[5] = &array;

// compound literal, fixed size, can be allocated in any scope
int (*b)[5] = &(int[5]){11,2,3,5,6};

// dynamically allocated array, variable size possible
int (*c)[n] = malloc( sizeof(int[n]) );

// variable-length array, variable size
int n = 5;
int vla[n];
memcpy( vla, something, sizeof(int[n]) ); // always initialized in run-time
int (*d)[n] = &vla;
4
Lundin
int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;
1
user1814023
int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;

次に、次のように配列のコンテンツにアクセスします。

(*arr)[0] = ...
0
Stefano Falasca