Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我不明白这段代码是如何在MS Visual C中执行的+;编译程序_C++_Arrays_Pointers - Fatal编程技术网

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可以考虑如果他喜欢的话。没有具体的答案!!你希望得到什么具体的答案?也许你应该更清楚地陈述,你想知道什么?