C改变变量和数组值
C changing variable and array value
一开始代码 a[0] 变为 31,但在第二个代码中 a 仍然是 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;
}
而且任何一本体面的书都应该提到函数的参数是按值传递的,这意味着调用中的值是复制到局部函数参数变量。
修改这个局部变量只会修改本地副本,不会修改函数调用中使用的值。
可以通过模拟 按引用传递 来克服这个问题,这是通过传递指向变量的指针来完成的:
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
}
这确实是您展示的第一个程序中发生的事情,您传递一个指针,并修改指针指向的位置的值(尽管是零大小的数组)。
您的主要困惑之一似乎是关于您的 "array" 论点。
当您将函数声明为
void f(int a[]);
你实际上并没有声明一个数组参数:编译器会将其视为一个指针并将其解析为
void f(int *a);
还有一点就是当你使用数组索引时,比如
x[i] += x[i];
你实际上是在取消引用指针,并将值写入指针指向的内存。事实上,对于任何指针或数组 x
和索引 i
,表达式 x[i]
正好等于 *(x + i)
.
一开始代码 a[0] 变为 31,但在第二个代码中 a 仍然是 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;
}
而且任何一本体面的书都应该提到函数的参数是按值传递的,这意味着调用中的值是复制到局部函数参数变量。
修改这个局部变量只会修改本地副本,不会修改函数调用中使用的值。
可以通过模拟 按引用传递 来克服这个问题,这是通过传递指向变量的指针来完成的:
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
}
这确实是您展示的第一个程序中发生的事情,您传递一个指针,并修改指针指向的位置的值(尽管是零大小的数组)。
您的主要困惑之一似乎是关于您的 "array" 论点。
当您将函数声明为
void f(int a[]);
你实际上并没有声明一个数组参数:编译器会将其视为一个指针并将其解析为
void f(int *a);
还有一点就是当你使用数组索引时,比如
x[i] += x[i];
你实际上是在取消引用指针,并将值写入指针指向的内存。事实上,对于任何指针或数组 x
和索引 i
,表达式 x[i]
正好等于 *(x + i)
.