我不明白这段代码是如何在MS Visual C++编译器中执行的

I did not understand how this code exectuded in MS Visual C++ compiler

本文关键字:Visual MS C++ 编译器 执行 明白 段代码 代码      更新时间:2023-10-16

可能重复:
如何在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;
}

对于第一个print语句,我得到A[5]=0,对于第二次,A[5]=5。这个代码实际上是如何工作的?

在C++中,从程序员的角度来看,数组几乎等于指向其第一个元素的指针。在通过参数传递数组的情况下,它们等于。如果你这样想,你可以把指针传给一个数组,然后修改它的第六个元素(仍然是原来的!(,然后显示它

您的代码等于:

void fn2(int * a)
{
    *(a + 5) = 5;
}
(...)
fn(&(A[0]));

旁注静态分配和动态分配数组的差异可以在处理局部变量时看到:

int a[5];
int * p;
printf("%d %dn", 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)