12

関数のパラメータが「int arr[]」または「int * arr」の場合、配列の値が変化することがわかりました。違いはどこにありますか?

整数配列[]:

void myFunction(int arr[], int size) {

    for (int i = 0; i < size; ++i)
        arr[i] = 1;
}

整数 * 配列:

void myFunction(int * arr, int size) {

    for (int i = 0; i < size; ++i)
        arr[i] = 1;
}

どちらの関数も配列値を変更します。

int main(){

     int array[3];

     array[0] = 0;
     array[1] = 0;
     array[2] = 0;

     myFunction(array, 3);

     return 0;

 }
4

4 に答える 4

8

違いはありません。両方の関数タイプ (調整後) は、「へのポインタを受け取り、 を返す関数intintですvoid。これは単なる C++ の構文上の癖です。[]非参照型の関数パラメーターの最も外側は と同義*です。

于 2013-05-25T09:27:58.107 に答える
0

同じことを表現するさまざまな方法があります。配列をポインターで関数に渡すだけです。

于 2013-05-25T09:27:03.723 に答える
-2

配列を関数に渡すと、ポインターによって暗黙的に渡されます。配列パスバイバリューコピーに多くの要素がある場合、それは巨大なオーバーヘッドになるためです。たとえ違うように見えても同じです。

両方の機能を同時に使用することはできません。コンパイル時エラーを行う場合

 error: redefinition of 'void myFunction(int*, int)'
 it is already defined.
于 2013-05-25T09:27:06.330 に答える
-3

違いはありません。実際、配列の宣言はポインタを返すことができます。ただし、変数が配列であることを宣言で指定する場合 ([] を使用) は、暗黙的に行われるため、ポインターになることを指定する必要はありません。ただし、これを指定しない場合は、テーブル変数に影響を与えた場合はポインターとして宣言するか、「new []」の結果として宣言する必要があります。設計時に配列サイズが不明な場合、テーブルのポインタの使用は動的割り当てにのみ関係します。

于 2015-02-09T09:12:27.337 に答える