1

重複の可能性:
C ++で配列を使用するにはどうすればよいですか?

void fn(int a[3])
{
    a[5]=5;
}

int main()
{
    int A[10] = {0};
    cout<<A[5]<<endl;
    fn(A);
    cout<<A[5]<<endl;
}

最初の印刷ステートメントではA[5]= 0を取得し、2回目はA [5]=5を取得しました。このコードは実際にどのように機能しますか?

4

3 に答える 3

3

C++ では、プログラマーから見た配列は、最初の要素へのポインターとほぼ同じです。パラメータで渡される配列の場合、それらはequalです。このように想像すると、関数に配列へのポインターを渡し、その 6 番目の要素 (元のままです!) を変更してから、それを表示します。

あなたのコードは次のようになります:

void fn2(int * a)
{
    *(a + 5) = 5;
}

(...)

fn(&(A[0]));

補足: 静的に割り当てられた配列と動的に割り当てられた配列の違いは、ローカル変数をいじっているときに確認できます。

int a[5];
int * p;

printf("%d %d\n", sizeof(a), sizeof(p));
于 2013-01-03T10:52:51.527 に答える
2

あなたがコーディングする:

void fn(int a[3])
{
    a[5]=5;
}  

コードと同等です:

void fn(int* a)
{
    a[5]=5;
}  

-S幸い、gcc(またはg ++)のオプションを指定してコードをコンパイルすることで確認できます。
両方で同じアセンブリ出力が得られます:(出力ファイルは.s拡張子付きになります)

fn:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax    // base address assign to eax register.
    addl    $20, %eax        // a[5] , because 5*4 = 20, so eax = eax + 20
    movl    $5, (%eax)       // this is =5 , (%eax) = 5
    popl    %ebp
    ret
    .size   fn, .-fn
    .section    .rodata     

どちらのコードも、fu()関数へのベースアドレスパスのみを使用します。

引数のサイズ3については何もありません

于 2013-01-03T11:03:59.530 に答える
-1

A のアドレスを渡して配列自体を変更する場合:

fn(int **A)
于 2013-01-03T10:57:29.087 に答える