C++ 我不明白这段代码是如何在MS Visual C中执行的+;编译程序
可能重复:C++ 我不明白这段代码是如何在MS Visual C中执行的+;编译程序,c++,arrays,pointers,C++,Arrays,Pointers,可能重复: void fn(int a[3]) { a[5]=5; } int main() { int A[10]={0}; 从程序员的视角来看C++数组中的CUT几乎等于指针的第一个元素。如果数组通过参数传递,它们是相等的。如果你这样设想,你就把指针传递给一个数组来运行,然后修改它的第六个元素(仍然是原来的!),然后显示它。 您的代码等于: void fn2(int * a) { *(a + 5) = 5; } (...) fn(&(A[0])); 旁注:在处理局部
void fn(int a[3])
{
a[5]=5;
}
int main()
{
int A[10]={0};
从程序员的视角来看C++数组中的CUT几乎等于指针的第一个元素。如果数组通过参数传递,它们是相等的。如果你这样设想,你就把指针传递给一个数组来运行,然后修改它的第六个元素(仍然是原来的!),然后显示它。
您的代码等于:
void fn2(int * a)
{
*(a + 5) = 5;
}
(...)
fn(&(A[0]));
旁注:在处理局部变量时,可以看到静态分配数组和动态分配数组之间的差异:
int a[5];
int * p;
printf("%d %d\n", sizeof(a), sizeof(p));
在程序员的视图中C++数组中的p>几乎等于指针的第一个元素。如果数组通过参数传递,它们是相等的。如果你这样设想,你就把指针传递给一个数组来运行,然后修改它的第六个元素(仍然是原来的!),然后显示它。
您的代码等于:
void fn2(int * a)
{
*(a + 5) = 5;
}
(...)
fn(&(A[0]));
旁注:在处理局部变量时,可以看到静态分配数组和动态分配数组之间的差异:
int a[5];
int * p;
printf("%d %d\n", sizeof(a), sizeof(p));
如果要传递的地址用于更改阵列本身,请执行以下操作:
fn(int **A)
如果要传递的地址用于更改阵列本身,请执行以下操作:
fn(int **A)
您的代码是:
void fn(int a[3])
{
a[5]=5;
}
相当于代码:
void fn(int* a)
{
a[5]=5;
}
幸运的是,您可以通过使用-S
选项将代码编译为gcc(或g++)来检查它。
您将获得相同的程序集输出:(输出文件的扩展名为.s
)
两个代码都只使用基址传递给fu()
函数
参数的大小3与代码无关:
void fn(int a[3])
{
a[5]=5;
}
相当于代码:
void fn(int* a)
{
a[5]=5;
}
幸运的是,您可以通过使用-S
选项将代码编译为gcc(或g++)来检查它。
您将获得相同的程序集输出:(输出文件的扩展名为.s
)
两个代码都只使用基址传递给fu()
函数
参数的大小3没有任何问题这其中的哪一部分不符合您的预期?数组是作为指针传递的,而不是按值传递的数组。也就是说,它们在传递给函数时不会被复制。我们如何将参数a传递给fn(int a[3])?也就是说,它的行为是否与int a[3]=&a[0]类似??我知道它是作为指针传递的!我已经编辑了我的上述评论!@srinivasprabhu函数原型中的参数实际上只是一个指针,其中存储了a的地址。因此,他获取地址并在位置5处操纵元素。这其中的哪一部分不符合您的预期?数组是作为指针传递的,而不是作为指针传递的按值排列的数组。也就是说,它们在传递给函数时不会被复制。我们如何将参数a传递给fn(int a[3])?也就是说,它的行为是否与int a[3]=&a[0]类似??我知道它是作为指针传递的!我编辑了我的上述注释!@srinivasprabhu函数原型中的参数实际上只是一个指针,其中存储了a的地址..因此他得到地址并在位置5处操作元素。代码与此完全相同。因此编写int a[3]不重要。它可以。C++动态地和静态分配的数组有点不同。例如,可以通过参数传递静态分配的数组(例如int(6)),但不能动态地定位(例如INT[]-必须使用指针来代替)。@ SpOK:我不确定你上面的注释是什么意思,但是听起来不正确!当你把静态分配的数组作为参数传递时,C++知道它是一个数组(甚至sisiof的行为也会正确)。如果你动态分配一个数组,你只能通过指针和siZeFo()来传递它。将只显示第一个元素的大小。这是我的代码和OP之间的核心区别,这就是为什么我写的是“几乎”而不是“完全”。代码与此完全相同。所以写int a[3]不重要。它可以。C++动态地和静态分配的数组有点不同。例如,可以通过参数传递静态分配的数组(例如int(6)),但不能动态地定位(例如INT[]-必须使用指针来代替)。@ SpOK:我不确定你上面的注释是什么意思,但是听起来不正确!当你把静态分配的数组作为参数传递时,C++知道它是一个数组(甚至sisiof的行为也会正确)。如果你动态分配一个数组,你只能通过指针和siZeFo()来传递它。将只显示第一个元素的大小。这是我的代码和OP之间的核心区别,这就是为什么我写的是“几乎”而不是“完全”。不,你不能更改数组的地址。不,你不能更改数组的地址。这个问题需要标准的证明,而不是实际的证明。“关于参数的大小3没有任何问题”-但仅适用于此特定代码。请尝试在int*和int[3]上调用sizeof()“Spok和Griees OK!我同意你们两个,如果他喜欢的话,OP可以考虑。没有具体的答案!你想得到什么具体的答案?也许你应该更清楚地陈述,你想知道什么?这个问题需要标准的证明,而不是实际的证明。”关于论证的大小3没有任何意义。但是,只有在这个特定的代码的情况下。尝试调用int(int)和int(3)。“Spok和Griees OK!我同意你们两个,OP可以考虑如果他喜欢的话。没有具体的答案!!你希望得到什么具体的答案?也许你应该更清楚地陈述,你想知道什么?