#include "stdafx.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
void test (int a,int *b, int result[], int serie[]);
int main()
{
int *serie = malloc(sizeof(int));
int result[20], a,b, i;
a=0;
b=0;
for (i = 0; i < 20; i++) {
result[i]=i+10;
serie[i]=rand();
printf("result is %d \n",result[i]);
}
test(a,&b,result,serie);
printf("value of a inside main %d \n",a);
printf("value of b inside main %d \n",b);
for (i = 0; i < 20; i++) {
printf("value of result inside main is %d and of serie is %d \n",result[i],serie[i]);
}
getchar();
return 0;
}
void test(int a, int *b, int result[], int serie[]) {
int i;
a=13;
*b=14;
printf("value of a inside the function %d \n",a);
printf("value of b inside the function %d \n",*b);
for (i = 0; i < 20; i++) {
result[i]=result[i]*2;
serie[i]=7;
printf("value of result inside the function is %d and of serie is %d\n",result[i],serie[i]);
}
}
基本上,所有这些代码都是看到变量的范围,我写它是为了帮助自己我想用一个函数更改main
内的整数值(参见int b
)您必须使用&b
(test(a,&b,result,serie);
)调用它,然后在函数*b
内调用它。所以我正在尝试使用数组进行那些操作&amp; *但是它们没有用。
看起来你需要做的就是编写数组void test(... int result[],int serie[])
并调用函数只是把名字放在没有括号的地方:test(...,result,serie);
我是对的吗?
如果我只想更改函数内的数组,如变量a
?
答案 0 :(得分:1)
数组总是在C中通过引用传递,因此将一个int数组的地址传递给一个函数(例如&result
中的main
)就像传递一个双指针(int**
)。您尝试此操作时收到的错误是输入错误。
如果我只想更改函数内的数组,如变量a?
,该怎么办?
我不确定你的意思是什么。你能澄清一下吗?
答案 1 :(得分:1)
你没有括号传递的原因是因为数组的名称默认为第一个条目的地址:
test(a, &b, result, serie);
// is the same as
test(a,&b, &result[0], &serie[0]);
要保存原始数组而不进行修改,您必须传递数组的副本而不是其地址。我能想到的最简单的方法是将数组包装在结构中并按值传递该结构。它会将整个数组复制到本地函数中,并允许您在不影响原始函数的情况下使用它。无法通过C中的值(我知道)传递数组。引用只返回数组的第一个条目 - 另一个C语言的怪癖。
答案 2 :(得分:1)
是的,这是正确的。为了修改数组,您需要做的只是声明:
void test(... int result[], int serie[]);
或者这个:
void test(... int *result, int *serie);
以上两者都是等效的。
为什么这是真的是你传入了一个指针,它通过值传递 。这与数组本身不同,后者是通过引用传递(通过指针)。因此指针被复制,如果你试图在不使用*
的情况下实际更改结果的值,它将不会持续到函数之外。如果要在不修改原件的情况下修改函数内部的数组,则必须先复制它们,然后再将它们传入之前或之后。