为什么这个函数在被调用时没有效果?
我是新手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;
}
,这是什么错误的原因是什么?
这是C.
在C语言中一个非常简单的例子,它使用一个叫做呼叫按值,以评估函数参数的方法。 这意味着当你用你的参数调用一个函数时,被调用的函数接收那些参数的值而不是参数。
在这个程序中,函数“change”收到整数50(值'a'持有)和10而不是a和10.所以当你调用函数时,我是50,j是10。在功能我改为60.但仍保持不变。如果您添加一个printf()以在“更改”中打印i的值,则可以看到发生了更改。
因此,为了使“变”有效,你必须在C.
使用指针,一个特殊的“工具”你必须改变你的“变”有如下功能:
void change(int *pi, int *pj)
{
*pi += *pj;
}
和你也应该改变电话。
int main()
{
int a = 50, b = 10;
/* printf line */
change(&a, &b);
/* printf line */
}
在函数 “变化”
void change(int i, int j)
变为
void change(int *pi, int *pj)
这意味着PI,PJ是指向int
。 pi
& pj
是保存变量地址的变量。
*pi
& *pj
是驻留在pi
& pj
具有地址的变量中。 这意味着*pi
指(点)a
,*pj
点b
*pi += *pj
等于
a = a + b;
,你可以看到,我已经改变了方式 “变”叫做
现在是
的change(&a, &b);
代替
change(a, 10);
与号(&)给出的变量 地址,以便&和& B是& B的地址,这意味着是举行在pi和pj
我认为这冗长的答案会帮助你。但是你应该阅读一些关于指针的课程。 OMG。
为什么要通过指针传递第二个参数?为什么不从函数返回结果?你也使用相当不常见的短语(例如指针不是“工具”)。好吧,也许是为了尝试帮助初学者,但没有做好,因为无论如何他必须学习术语,否则会变得更加困惑。 – Olaf
函数参数是它的局部变量。函数参数通过拷贝来初始化所提供的参数的值。所以任何参数的改变都不会影响相应的参数。 退出函数后,其参数(局部变量)被销毁。
例如,你能想象你的函数
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;
}
OMG。你需要一个基本的C课,不要介意。 –
关于指针的特别长的教训。 – Arc676
寻找传递值,然后阅读有关指针。 –