2

これは、ソート アルゴリズムの単純な実装です。私の質問はです。配列numbersは main で宣言および初期化されます。次に、関数の引数のように渡しますsort(Is a copy ?)。sort関数内でnumbers、現在呼び出されarrayている (私が知る限り、コピー) が変更 (ソート) されています。では、なぜ、関数を呼び出した後、配列numbersが変更されるのですか (これは私が望むものです。理由を知りたいのですが??.arrayスコープはsortではなくmainです。

int main(void)
{
    int numbers[SIZE] = { 4, 15, 16, 50, 8, 23, 42, 108 };
    for (int i = 0; i < SIZE; i++)
        printf("%d ", numbers[i]);
    printf("\n");

    sort(numbers, SIZE);

    for (int i = 0; i < SIZE; i++)
        printf("%d ", numbers[i]);
    printf("\n");
    return 0;
}
void sort(int array[], int size)
{
    int swaps = 0;

    while(swaps==0)
    {
        for(int i = 0; i < size ; i++)
        {
            for(int j = i + 1; j < size ; j++)
            {
                if( array[i] > array[j] )
                {
                    // Swapping
                    int temp = array[i]; 
                    array[i] = array[j];
                    array[j] = temp;

                    swaps ++;
                }   
            }
        }
    }    
}
4

4 に答える 4

6

int array[]と同じint *arrayです。ポインタを渡しています。

于 2012-11-08T00:07:18.780 に答える
1

void sort(int array[], int size)配列への参照を渡します。つまり、配列へのポインターを渡します (@pst が正しく指摘したように、これは正確な用語ではありません。C は常に値で渡します)-配列のコピーではありません。変更を加えると、元の配列が変更されます。

元の配列を変更したくない場合は、それをコピーしてコピーを渡します。

別の (より効率的な) 方法は、呼び出し元から割り当て、ポインターを関数に渡すことです。

void sort(int *const array,int [] result, int size)

これは、アルゴリズムが「その場で」動作する必要がない場合に特に便利です。

関数内でコピーを作成し、コピーへのポインターを戻り値として渡すことは技術的には可能ですが、実際には本当にお勧めできません。

  • スコープ外になるため、関数内に int[] を割り当てて返すことはできません
  • malloc を実行することはできますが、忘れがちな呼び出し元関数から解放することを忘れないでください。
于 2012-11-08T00:07:16.313 に答える
1

参照によって配列を渡したので、それに対する操作はメモリ内のその場所に影響します。

于 2012-11-08T00:07:35.393 に答える
-2

C では、パラメーターを関数/メソッドに渡す方法が 2 つあります。- 値の受け渡し - ポインタの受け渡し

値を渡すことには、変更可能な関数のコピーを提供できるという利点があります。欠点 (大きなオブジェクトの場合) は、データをコピーする必要があるため遅くなることです。

値がコピーされないため、ポインターを渡す方が (大きなオブジェクトをコピーするよりも) はるかに高速です。ただし、呼び出された関数が値を変更すると、元の変数も変更されます。これは意図的に行われることがあります (たとえば、並べ替え関数や複数の値を返す関数など)。

編集: どうやら私はここで何かを混同したので、それを修正しようとしました...もともと「参照による呼び出し」と「値による呼び出し」について話していましたが、C は実際には参照をサポートしていません。詳細については、コメントをお読みください。

于 2012-11-08T00:12:40.747 に答える