我是C的新手,我正在编写一些程序来尝试理解变量如何在函数之间传递和更改。我在下面写了一个简单的程序:
int number;
int test( int number ) {
number = 3;
return(number);
}
int main () {
printf ("\nPlease enter in any number between (10 - 99,999)!\n");
scanf("%d", &number);
test(number);
printf ("\nYour number probably wasn't: %d\n", number);
}
关键是输入一个数字,但无论你输入什么,这个数字都会改为3.出于某种原因,虽然当我对该数字进行测试时,它不会改为3而是用户而不是进入。请注意,我正在尝试更改变量编号,而不是将任何其他变量硬编码为3。
为什么这不起作用?
答案 0 :(得分:1)
您正在更改函数test
中的局部变量,而不是实际变量。您希望number = test(number);
作为main()
函数中倒数第二行的第二行。
您的函数test
不会处理您传递给它的原始number
。相反,它获取此变量的副本并在本地使用它。您在此函数中对number
所做的任何更改都将丢失(除非您传入参考资料,您可能会在稍后了解)。正如您所做的那样,解决此问题的正确方法是返回number
的值。但是,您根本不使用该返回值。当您说number = test(number);
时,您告诉计算机获取该返回值并将其分配给原始number
(main
中的那个),这就是您想要的。
答案 1 :(得分:1)
更改
test(number);
到
number = test(number);
否则test
返回的值将被丢弃,您将获得输入的数字,而不是3
。
获得所需效果的另一种方法是将指针传递给number
:
void test( int *number ){..}
并将该函数调用为
test(&number);
有些答案建议使用number
作为全局变量。我建议你do not use global variable when it is unnecessary。
答案 2 :(得分:1)
int number; //a
int test( int number ) { //b
number = 3;
return(number);
}
在测试中,实际上有两个变量名为number,
a
(也是主要使用的数字)和b
具有优先权
您将参数b
更改为3
但是,该参数只是主体中原始传递值的副本
(像往常一样在C和C ++中),并被丢弃并结束测试
此外,您没有在main中使用返回值,因此3已经消失。
答案 3 :(得分:1)
到目前为止,所有答案似乎都忽略了这样一个事实:你正在尝试一些没有多大意义的事情。你从函数返回基本上是常数的东西,但是使用传递的值作为一些中间存储,而这是完全没必要的。这两个中的任何一个都可以工作:
void test( int& number ) {//We don't need to return anything, because we pass number by reference, and so changes made to it will persist outside this functions scope
number = 3;
}
int test(){
return 3; //We just return 3, we don't need any arguments passed to the functions in this version
}
现在,在第一种情况下,您将函数调用为
test(number); //number will be changed by test because it's passed by reference
在第二种情况下,您将函数称为
number = test(); //Here test just returns 3 and we assign that value to number.
编辑:
为了完整起见,我将添加您可以使用的第三个版本:
void test(int* number){//Here we pass a pointer to an integer to test
*number = 3;//and change the value pointed to be number to 3. Read * as 'value pointed at by'. So this says 'value pointed at by number = 3'
}
在这种情况下,您将该函数称为
test(&number)//read & as 'pointer to'. So now we pass 'pointer to a' to test.
请注意,此版本基本上是我提到的第一个版本的不太优雅且更容易出错的版本(至少在此特定方案中)。它们的用法和效果或多或少相等,但在第一个版本中,您不需要关注解除引用以及使用指针的一般事实。
答案 4 :(得分:1)
也许你误解了“变量范围”的概念。
int number;
变量'number'的第一次出现是在所有函数(和大括号)之外声明的。因此,它具有“全球”范围。
int test( int number ) {
定义为test()参数的变量“number”的范围有限。它的寿命和可见性仅限于test()函数的大括号。在这些括号之外,这个“数字”变量不存在。
'全局'变量'number'和'test()'变量'number'彼此不同,每个都有自己独特的值。
由于它们的名称相同,因此'test()'括号内的“全局”变量“数字”变得无法访问。因此,对'test()'括号内的'数字'的任何操纵都不会对'全局'变量'数字'产生任何影响。
number = 3;
以上对“全局”变量“数字”没有影响。相反,它只将'local'变量'number'初始化为3。
return(number);
以上将返回'local'变量'number'(3)的值。
}
int main () {
printf ("\nPlease enter in any number between (10 - 99,999)!\n");
scanf("%d", &number);
上面的行将“全局”变量“数字”设置为用户输入的值。
test(number);
上面的行传递'global'变量'number'的值来测试。它不捕获测试返回的“返回”值(3)。如果需要,可以重写上述行:
number=test(number);
上面的行会将'global'变量'number'设置为test(3)的返回值。
printf ("\nYour number probably wasn't: %d\n", number);
}
答案 5 :(得分:0)
您的代码永远不会返回值test
。如果您没有调用这两个变量(main
中的变量和test
中的变量{}} number
,那么您的代码将更容易理解。
答案 6 :(得分:0)
您有2个选项。一个是
number = test(number);
其次是参考C中的指针。通过地址可以帮到你。
答案 7 :(得分:0)
它不起作用,因为您按值进行传递而不是按引用传递。如果你希望在调用函数时数字的值总是为3而不进行赋值,那么你应该做类似的事情:
void test(int *number){
*number = 3;
}
并打电话:
test(&number);