1

重複の可能性:
2 次元配列は double ポインターですか?

void fun(int **ptr,int n)
{
int i=0;j=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
 printf("%d  ",a[i][j]);

}

Int main()
{
int arr[20][20];
int **ptr=arr;  //Statement 1
fun(arr,20);
}

ステートメント 1 では警告が表示され、関数呼び出しでは警告が表示されないのはなぜですか? これは関数呼び出しの例外的なケースであることがわかりました。これには理由がありますか?配列へのポインター「arr」が二重ポインター「ptr」になり、配列へのポインターのように使用できるのはなぜですか? 前もって感謝します。

4

2 に答える 2

2

int **int (*)[20]は 2 つの基本的に異なるタイプであるためです。後者の場合、それが指す配列のサイズはコンパイル時に固定されます。

を逆参照すると、を指すポインターがint **見つかることが期待されます。a を逆参照すると、ポインターではなく、20 のブロックが見つかることが期待されます。int*intint (*)[20]int

を割り当てるとint arr[20][20]、ではなくarrと同等のコンパイル時のシンボルになります。後者が必要な場合は、 を割り当ててから、を含む別のメモリ ブロックへのポインタを設定する必要があります。int (*)[20]int **int * arr[20]int [20]

于 2012-11-29T17:54:58.273 に答える
0

ステートメント 1 では警告が表示され、関数呼び出しでは警告が表示されないのはなぜですか?

コンパイルできるようにコードを修正した後、次のようになります。

danger.c: In function ‘main’:
danger.c:15:11: warning: initialization from incompatible pointer type [enabled by default]
danger.c:16:1: warning: passing argument 1 of ‘fun’ from incompatible pointer type [enabled by default]
danger.c:3:6: note: expected ‘int **’ but argument is of type ‘int (*)[20]’

警告の理由はよく説明されています(IMOはエラーであるはずですが、gccは非常に寛容です)。互換性のないポインター型を渡しています。そして、その警告はデフォルトの警告レベルでも発生します。

于 2012-11-29T17:16:21.303 に答える