0

私はそれを読みました。
配列名は (ポインターに減衰した後) ポインターとして使用できますが、新しい値を割り当てることはできません。他の場所を指すようにしようとするとエラーになります:

while (*a != 0)  // a is of (int *) type  
    a++;         //wrong

一方、関数に渡されると、配列名は常にポインターとして扱われます。関数呼び出し

largest = largest_num(b, n) // b is an array of int

関数のために

int find_largest(int a[], int n)
{

   ....
   ....

}

の最初の要素へのポインタbaに割り当てられます。
上記の 2 つのステートメント (太字) は矛盾しているように思えます。私は混乱しています。

4

2 に答える 2

2

そこに矛盾はありません - あなたはまだ (へのint)ポインターで作業しており、int a[]表記法は便宜上のみ許可されています。comp.lang.c FAQ の引用:

配列はすぐにポインターに分解されるため、配列が実際に関数に渡されることはありません。関数が配列をパラメーターとして受け取るふりをして、対応するパラメーターを配列として宣言することでそれを説明できます。

void f(char a[])

文字どおりに解釈すると、この宣言は役に立たないため、コンパイラは向きを変えて、関数が実際に受け取るものであるため、ポインター宣言を記述したふりをします。

void f(char *a)

配列のような宣言子からポインターへのこの変換は、関数の仮パラメーター宣言内でのみ保持され、それ以外の場所では保持されません。変換が気になる場合は、強制的に使用する必要はありません。多くのプログラマーは、それが引き起こす混乱は、宣言が呼び出しや関数内での使用に「似ている」という小さな利点よりも重要であると結論付けています。

于 2013-09-14T20:16:31.580 に答える