[第一个代码a [0]变为31,而第二个代码仍为55。有人可以解释一下我的区别吗?在函数中更改变量和数组的值有什么区别?
#include <stdio.h>
int h(int x[]);
int main()
{
printf("Hello, World!\n");
int a[0] = 55;
h(a);
printf("%d", a[0]);
return 0;
}
int h(int x[]) {
x[0] = 31;
}
#include <stdio.h>
int h(int x);
int main()
{
printf("Hello, World!\n");
int a= 55;
h(a);
printf("%d", a);
return 0;
}
int h(int x) {
x = 31;
}
然后这段代码呢?此数组已更改。我真的很困惑。
#include <stdio.h>
int h(int x[], int length);
int main()
{
int i;
int a[]= {5, 5, 5, 5};
h(a, 4);
printf("Array After Function Call\n");
for(i = 0; i < 4; i++) {
printf("%d ", a[i]);
}
return 0;
}
int h(int x[], int length) {
int i;
for(i = 0; i < length; i++) {
x[i] += x[i];
}
printf("Array in Function\n");
for(i = 0; i < length; i++) {
printf("%d ", x[i]);
}
printf("\n");
return 0;
}
而且任何体面的书都应该提到函数的参数是通过[[by value传递的,这意味着调用中的值copied传递到了本地函数参数变量中。
修改此本地变量将仅修改本地副本,而不修改函数调用中使用的值。可以通过模拟
通过引用传递
来克服此问题,这是通过将指针传递给变量来完成的:void f(int *x)
{
*x = 123; // Dereference the pointer, to set the value of where it's pointing
}
int main(void)
{
int a = 0;
f(&a); // Pass a pointer to the variable a
}
这实际上是在您显示的第一个程序中发生的事情,传递了一个指针,并修改了指针所指向的位置的值(尽管大小为零的数组)。
似乎您的主要困惑之一是关于“数组”参数的问题。当您声明一个函数为]时>
void f(int a[]);
您实际上没有声明数组参数:编译器会将其视为并将其解析为pointer
void f(int *a);