重複の可能性:
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を取得しました。このコードは実際にどのように機能しますか?
重複の可能性:
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を取得しました。このコードは実際にどのように機能しますか?
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));
あなたがコーディングする:
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については何もありません
A のアドレスを渡して配列自体を変更する場合:
fn(int **A)