我是新手C学习者,以下代码是我的问题:
我写了它来改变传递变量的值,但是在输出中发生了notihng。
这是我的代码:
#inlcude <stdio.h>
void change(int i, int j) {
i = i + j;
}
int main() {
int a = 50;
printf("a before = %d\n", a);
change(a, 10);
printf("a after = %d\n", a);
return 0;
}
出现此错误的原因是什么?
答案 0 :(得分:4)
函数参数是其局部变量。函数参数由提供的参数值的副本初始化。因此,任何参数的更改都不会影响相应的参数。 退出函数后,其参数(局部变量)将被销毁。
例如,您可以想象您的功能
void change(int i, int j) {
i = i + j;
}
被称为
change(a, 10);
以下方式
void change(/*int i, int j*/) {
int i = a;
int j = 10;
i = i + j;
}
正如您所看到的,变量本身不会被更改。
有两种方法。第一个参数将通过引用传递,或者函数将返回其结果。例如
#inlcude <stdio.h>
void change( int *i, int j) {
*i = *i + j;
}
int main() {
int a = 50;
printf("a before = %d\n", a);
change( &a, 10);
printf("a after = %d\n", a);
return 0;
}
或者
#inlcude <stdio.h>
int change(int i, int j) {
i = i + j;
return i;
}
int main() {
int a = 50;
printf("a before = %d\n", a);
a = change(a, 10);
printf("a after = %d\n", a);
return 0;
}
答案 1 :(得分:2)
这是一个非常简单的案例。
在C中,它使用一种名为Call-By-Value的方法来评估函数参数。 这意味着当您使用参数调用函数时,被调用函数将接收这些参数的值而不是参数。
在此计划中,功能&#34;更改&#34;接收整数50(&#39; a&#39;保持的值)和10而不是a和10.所以我是50,当你调用函数时j是10。在功能中我改为60.但是仍然是一样的。如果你添加一个printf()来打印&#34中的i的值;改变&#34;你可以看到发生的变化。
所以要做出改变&#34;有效的你必须使用指针,一个特殊的&#34;工具&#34;在C.
你必须改变你的改变&#34;功能如下:
void change(int *pi, int *pj)
{
*pi += *pj;
}
你也应该改变电话。
int main()
{
int a = 50, b = 10;
/* printf line */
change(&a, &b);
/* printf line */
}
在功能&#34;改变&#34;
void change(int i, int j)
变为
void change(int *pi, int *pj)
这意味着pi,pj是指向int
的指针。 pi
&amp; pj
是用于保存变量地址的变量。
*pi
&amp; *pj
是位于pi
&amp;的地址中的变量。 pj
有。
这意味着*pi
引用(指向)a
,*pj
指向b
*pi += *pj
等于
a = a + b;
你可以看到我改变了方式&#34;改变&#34;称为
现在是
&符号(&amp;)给出变量的地址 因此&amp; a和&amp; b是&amp; a和&amp; b的地址。 b,这意味着在pi和pj中持有change(&a, &b);
而不是
change(a, 10);
我认为这个冗长的答案会对你有所帮助。但是你应该阅读一些关于指针的课程。
答案 2 :(得分:1)
i
中的变量j
和change()
是main()
内变量的副本。你必须学习如何实现你想要做的事情。基本上它看起来像这样:
#include <stdio.h>
void change(int *i, int j) {
*i = *i + j;
}
int main() {
int a = 50;
printf("a before = %d\n", a);
change(&a, 10);
printf("a after = %d\n", a);
return 0;
}