c语言小问题

#include<stdio.h>
void func(int x)
{
x=20;
}
int main()
{
int x=10;
func(x);
printf("%d",x);
return 0;
}

结果为啥是10而不是20?

#include<stdio.h>
void func(int x)
{
x=20;
}
int main()
{
int x=10;
func(x);
printf("%d",x);
return 0;
}
-------
x没有改变,所以是10;

如果要返回20;可以这样写;你对比一下;
#include<stdio.h>

int func(int x) //这里x的作用域只在这个函数内,这个x和主函数的x并不是同一个x;你可以试着改一下,将这里的x改成其他变量,结果还是一样。

{

x=20;

return x; //这样函数调用后,这个函数返回值为20;

}

int main()

{

int x=10;

int y;

y=func(x);

printf("%d\n",y); //x作为实参传入func()后,不用指针的话是不能改变x的值;所以,如果这里用x的话,还是是10;

return 0;

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-18
你只传近了x的值,在func方法里爱你不具备改变这个变量的权利,不能改变x的值。如果你把func(int x) 改成 func(int &x),它就可以在函数里改变那个值了,这涉及到,传值和传址:
 首先你要认识函数传参是怎么进行的
函数传参是复制形的,举个例子说:
void modify(int a)
{
a++;
}
void main()
{
int a=5;
modify(a);
printf("%d",a);
}
这个程序的答案还是5。为什么?
因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中所有的操作都是相对于这个新开辟的内存空间而言的,对原来的a没有任何改变。
现在就来说说指针,如果用指针传参的话那就完全不一样了,指针(pointer),说白了即是指向变量内存地址。同样上面的例子:
void modify(int * a)
{
(*a)++;
}
void main()
{
int a=5;
modify(&a);
printf("%d",a);
}
这个答案当然是6
因为你传进去的是a的地址,所以在modify函数中的操作都是对a地址上的内容进行操作,即是操作a所以modify函数不用返回这个数,main中a的值也会改变。因为大家都是操作同一个内存空间,而上面不用指针,modify操作的是另一个新开辟的内存空间,只是这个内存空间初始值和a一样。
现在来说说传参,其实你“为什么函数参数是字符串的多用指针?” 那句我不是很明白,C中的字符串传参好像就指针一种形式(除非用结构体)。
何时用指针,何时用拷贝。当传的参数是一个结构体,而这个结构体比较大,这时最好用指针,因为如果用拷贝的话,单单花在拷贝的时间就要浪费很多,而如果这个函数经常被调用,那么这效率问题就出现了。
你在子函数中要对你的主调用函数中变量进行操作时也可以用指针做参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。
多看点书,多写点程序,刚开始学都会对指针比较迷茫。写多了,自然而然就懂了。
第2个回答  2015-11-18
void func(int x)这个里面的int x是个局部变量,int x=10;也是一个局部变量,也就是int x这里面,x的值是20,但是到了main函数里面,x=10,而你打印的值恰恰就是这个值而不是void func(int x)这里面的值