我不明白这段代码是如何在MS Visual C++编译器中执行的
I did not understand how this code exectuded in MS Visual C++ compiler
可能重复:
如何在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)
相关文章:
- 如何在MS Visual Studio 2019中运行QT UI
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 从现有源创建 MS Visual C++ DLL 项目
- 带有unique_ptr的通用单链表,MS visual studio C++中存在未知错误
- Python:在Windows上选择C++编译器 - MS Visual Studio到Mingw-w64.(PySta
- 在 Ubuntu 12.04 上运行,一个在 Windows 上的 MS Visual Studio 中用 c++11
- C++中动态分配的单向链表的赋值运算符 (MS Visual Studio 2015)
- MS Visual C 释放和调试构建之间的不同行为的可能原因
- 在 Windows 7 下的 Visual Studio 2015 上缺少 Api-ms-win-core-errorh
- stdlib.h's random() on MS Visual Studio 2008
- C++ File - MS Visual Studio
- MS Visual Studio 2012和OpenCV 2.4.5-未显示图像
- std::reference_wrapper on MS Visual Studio 2013
- 如何使 MS-Visual C++应用程序最大化
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- 在MS Visual Studio 2010监视窗口中评估模板函数
- 是否将资源(声音文件)添加到exe?[MS Visual Studio 2012]
- MS Visual Studios链接错误.2010年和2013年
- 哪些组件与MS Visual Studio 2012/2013一起安装是不必要的
- strcpy_s是C++标准的一部分吗?或者只是MS Visual C++的一部分