2

以下のfoo関数は、指定された数値の最初の出現を見つけ、そのインデックスを返します。数値が見つからない場合は、配列のサイズ (n) を返します。

‪int foo(int arr[10], int num, int n)‬
{
‫;‪   int *p‬‬
‪   for (p=arr;(*p!=num) && (p<arr+n);++p);‬‬
   ‫;‪return p-arr‬‬
}

私の質問は次のとおりです。パラメーターint arr[10]は書き込みと同じですか、int * arrそれとも同じint arr[]ですか?サイズ 100 の int 配列を渡すと、それを反復処理でき、10 個の要素に制限されないためです。

4

5 に答える 5

2

はい、int arr[10]int arr[]、およびint *arr関数の引数リストでは、すべてまったく同じことを意味します。

C99 には新しいオプションがあります: int arr[static 10]. これは、少なくとも 10 個の要素を指すアドレスを関数に渡す必要があることを意味します (未定義の動作のペナルティの下で)。

于 2013-01-31T12:09:56.640 に答える
2

私の質問は次のとおりです。パラメーターint arr[10]は書き込みと同じですか、int *arrそれとも同じint arr[]ですか?

はい、それが関数の引数リストの宣言の一部であり、配列が 1 次元である限り。

于 2013-01-31T12:05:43.417 に答える
1

コードが「キャップ」されていると予想するのはなぜですか? 何が起こるでしょうか?

C には「安全な」配列インデックスはありません。指定した場所にインデックスを付けるだけです。限界を超えないかどうかはあなた次第です。

私の意見では、関数をより一般的にし、配列/ポインターの問題に関する混乱を避けるため、あなたが行ったように、サイズを明示的に渡すことが常に最善です。

于 2013-01-31T12:03:57.077 に答える
0

*arr を実行すると、基本的に配列の最初の要素へのポインターが渡されます。

ポインターの振る舞いは、配列の使用の補完として使用できるため、まったく問題ありません。

arr[1] のようなことをすると、最初の要素へのポインター arr が自動的に 1 ずつインクリメントされ、配列内の 2 番目の要素のアドレスを指します。

于 2013-01-31T12:34:54.677 に答える
0

反復することはできますが、メモリの領域に対しては、クリーンな方法で行うべきではありません。

int foo(int *arr, int num, int n)‬
{
    int i;
 ‪   for (i=0;arr[i]!=num && i<n; i++);‬‬
    ‫;‪return i‬‬
}

その上、 p=arr を実行してから p を使用するため、arr をどのように定義しても問題ありません。

于 2013-01-31T12:05:00.350 に答える