過去の試験問題からの質問:
"次のうちどれ:
int a[4][4], (*b)[4], *c[4], **d;
intへのポインタへのポインタを期待する関数に渡すことができますか
int funct(int **);
あなたの答えを説明しなさい。"
答えは c で、di は信じますか?
残りが許可されない理由を理解するのに苦労していますか?
どんな助けでも大歓迎です。
過去の試験問題からの質問:
"次のうちどれ:
int a[4][4], (*b)[4], *c[4], **d;
intへのポインタへのポインタを期待する関数に渡すことができますか
int funct(int **);
あなたの答えを説明しなさい。"
答えは c で、di は信じますか?
残りが許可されない理由を理解するのに苦労していますか?
どんな助けでも大歓迎です。
上記の回答の違いに関する情報を追加できれば。
これ -配列を宣言するときは[]
、これよりも優先されます。*
配列とポインターは常に交換可能である (交換可能ではない) という仮定と組み合わせることで、多くの人が誤解しています。
int *arr[]
左から右に読むことは自然な仮定であるため、単純に配列へのポインタであると仮定します。
ただし、実際には整数ポインターの配列です。配列へのポインタが必要ですか? C に次のように伝えます。
int (*arr)[array_size];
独自の優先順位を設定することによって。
カールが答えのみを説明c
したように、既にポインターへのポインターがあり、関数に引数として渡されるとポインターの配列がポインターへのポインターに減衰するd
ため、適用できます。d
c
a
とを読み取る関数が必要な場合b
は、署名を次のように変更する必要があります。
int funct(int (*array_name)[array_size]);
上記では、ポインタが指す配列のサイズを指定する必要があることに注意してください。
一般に、配列を関数に渡すと、配列の最初の要素へのポインターとして渡されます...
int a[4][4] を関数、つまり fun(a); に変換します。int (*p)[4] として渡されるので、fun パラメータは fun(int (*p)[]) でなければなりません。
最初の要素自体は 4 つの整数の配列です
fun(a) ---> fun(int (* p)[])
int (*b)[4] は 4 つの整数の配列へのポインターであるため、fun(b) を呼び出すにはパラメーターが fun(int (*pt)[]) である必要があります
fun(b) ---> fun(int (*pt )[])
int *c[4] は 4 つの整数ポインターの配列です。そのため、fun(c) を呼び出すには、パラメーターが配列の最初の要素へのポインターである必要があります。ここで、最初の要素はそれ自体が int ポインターです..so fun(int **p)
fun(c) ---> fun(int **p)
int **d は int への double ポインターです。そのため、fun(d) を呼び出すには、パラメーターが fun(int **p)
fun(d) である必要があります ---> fun(int **p)