可能重复:
如何在 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,第二次得到 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,第二次得到 A[5]=5。这段代码实际上是如何工作的?
在 C++ 中,从程序员的角度来看,数组几乎等于指向其第一个元素的指针。在通过参数传递的数组的情况下,它们是equal。如果你这样想,你将指向一个数组的指针传递给函数,然后修改它的第六个元素(仍然是原来的!),然后显示它。
您的代码等于:
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)