1

2D 配列を関数に渡そうとしています。インターネットで提供されている別のソリューションを試しました。

int arr[3][4];
fun (arr);



1) void fun(int *a[4]) {} -- result into a compilation error (cannot convert int (*)[4] to int **)

2) void fun(int(*a)[4]) {} -- works fine.

上記の2つの宣言の違いと、1.の場合にエラーがあることを知りたいです。

4

5 に答える 5

5

さて、これはこれまでに役立つcdeclがそれについて言っていることです:

  • int *a[4]「int へのポインターの配列 4 として a を宣言する」ことを意味します
  • int(*a)[4]「int の配列 4 へのポインタとして a を宣言する」ことを意味します
于 2013-03-06T15:57:00.740 に答える
1

これは、整数への 4 つのポインターの配列を宣言します。

int* a[4];     // (a)

一方、これは:

int (*a)[4];   // (b)

4 つの整数の配列へのポインターを宣言します。

配列は関数の引数として使用されると (最初の要素への) ポインターに減衰するため、型のオブジェクトを上記(b)int arr[3][4]型のパラメーターを受け入れる関数に渡すと成功します ( へのポインター、つまりへの減衰は成功しますが、パラメーターの型が(a)の場合は失敗します。int[4]int (*)[4])

于 2013-03-06T15:57:20.147 に答える
0
  1. int* a[4]int*4の配列です
  2. int (*a)[4]int4の配列へのポインタです

配列の名前は、最初の要素へのポインターに変換できます。つまりarr、それはの名前であるため、それ自体が。int[3][4]である最初の要素へのポインタに変換されます。そのタイプはです。そのため、2番目のケースで合格することができます。arrint[4]int(*)[4]arr

C ++では、次のように完全な配列への参照を渡すことができます。

void fun(int(&a)[3][4]) {}

この場合、配列からポインタへの変換は行われません。2D配列自体への参照を取得しているだけです。

于 2013-03-06T15:56:16.677 に答える
0

int *a[4]はへの4つのポインタの配列ですが、は4の配列へのポインタintです。int(*a)[4]int

&配列は最初の要素へのポインタに減衰するため( 、sizeofまたはのオペランドとして使用されていない限り_Alignof)、a[3][4]に変換され(*a)[4]ます。

于 2013-03-06T15:56:41.083 に答える
0

sizeof_Alignof、または単項演算子のオペランドである場合、または&宣言で別の配列を初期化するために使用される文字列リテラルである場合を除いて、型 "N 要素配列" のTは型 "pointer の式に変換されます。にT、式の値は配列の最初の要素のアドレスになります。

関数呼び出しで

fun(arr);

の型arrは「3要素配列の4要素配列int」です。は、、単項演算子arrのオペランドではないため、 のように記述される「の 4 要素配列へのポインタ」型の式に変換され、その値は のアドレスになります。 sizeof_Alignof&intint (*arr)[4]a[0]

後置演算子 like[]およびのよう()な単項演算子よりも優先順位が高い*ため、はポインターの要素配列ですが、 は要素配列への*a[N]ポインターです。同様に、はポインタを返す関数で、 は関数へのポインタです。 N(*a)[N]N*f()(*f)()

于 2013-03-06T16:06:10.273 に答える