C语言“局部变量作用域”的问题
voidadd(int);main(){intnum=3;add(num);//调用add()函数printf("%d\n",num);//输出变量num值为3}void...
void add(int);
main()
{
int num=3;
add(num); //调用add()函数
printf("%d\n",num); //输出变量num值为3
}
void add(int num)
{
num++; //num自增1
printf("%d\n",num); //输出变量num值为4
}
为什么不对呢?哪里不对呢? 展开
main()
{
int num=3;
add(num); //调用add()函数
printf("%d\n",num); //输出变量num值为3
}
void add(int num)
{
num++; //num自增1
printf("%d\n",num); //输出变量num值为4
}
为什么不对呢?哪里不对呢? 展开
122个回答
展开全部
这是函数参数的引用传递和值传递的问题,你这种方法是值传递
其实main和add中的num并不是同一个
只是调用add的时候,把mian里面num的值复制给了add中的num
所以add中的num自增并不影响main的实参
你改成void add(int &num) 这样是引用传递,就可以看到效果了
其实main和add中的num并不是同一个
只是调用add的时候,把mian里面num的值复制给了add中的num
所以add中的num自增并不影响main的实参
你改成void add(int &num) 这样是引用传递,就可以看到效果了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
题主说的不对是哪个地方?
虽然在main函数和add函数中,变量名都是num,但它们是两个东西。
为方便描述,称前者为num1后者为num2。
num1的作用域范围为其声明到main()的}为止。num2的作用域范围为其声明到add()的}为止。在main()的整个生命周期中,num1一直存在。在add()的整个声明周期中,num2一直存在。一旦函数结束,则释放相应变量所占用的内存空间。
因此,每次在调用add()时,系统会为num2分配一个新的空间,并将num1的值赋给num2,在add()结束后,释放num2空间。在add()的整个生命周期中,内存存在有两个num(即num1和num2),add()对num的所有操作都是对num2这个新的空间里的值进行的操作。因此不会影响同名的num1的状态。
如果你希望对num1的值进行操作,请将num1的地址赋给num2,并使用*访问num1的值。
虽然在main函数和add函数中,变量名都是num,但它们是两个东西。
为方便描述,称前者为num1后者为num2。
num1的作用域范围为其声明到main()的}为止。num2的作用域范围为其声明到add()的}为止。在main()的整个生命周期中,num1一直存在。在add()的整个声明周期中,num2一直存在。一旦函数结束,则释放相应变量所占用的内存空间。
因此,每次在调用add()时,系统会为num2分配一个新的空间,并将num1的值赋给num2,在add()结束后,释放num2空间。在add()的整个生命周期中,内存存在有两个num(即num1和num2),add()对num的所有操作都是对num2这个新的空间里的值进行的操作。因此不会影响同名的num1的状态。
如果你希望对num1的值进行操作,请将num1的地址赋给num2,并使用*访问num1的值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在main中int num;一次
在add括号中形参 int num;一次
这样的话这2个num虽然名字一样,但不是同一个变量。
也就是说。当你执行add(num),时候,这里的num是第一个num,值是3,但到了大括号里面,的num用的就是第二次申请的num变量,并且初始值等于add();
括号里的值。当add执行结束,形参num身为局部变量就会失效。以后出现的num就是第一个变量num;
不建议形参和局部变量名字和全局变量或者其他局部变量名字相同,容易混淆
在add括号中形参 int num;一次
这样的话这2个num虽然名字一样,但不是同一个变量。
也就是说。当你执行add(num),时候,这里的num是第一个num,值是3,但到了大括号里面,的num用的就是第二次申请的num变量,并且初始值等于add();
括号里的值。当add执行结束,形参num身为局部变量就会失效。以后出现的num就是第一个变量num;
不建议形参和局部变量名字和全局变量或者其他局部变量名字相同,容易混淆
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-06-15
展开全部
add(int )你传入的是一个值,不是地址,在函数里面是4,在外面变量值是没变的,是值传递,不是地址传递啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//由于add函数里定义了“int num”,add函数里写的“num”只能是属于add函数的局部变量。
//调用add函数时是将“main的num”的值赋给“add的num”。
//num自增1是将“add的num”自加一,但没有改变“main的num”的值。
//如果想改变main内的num,应该这么写。
#include<stdio.h>
void add(int *);
main()
{
int num = 3;
add(&num); //调用add()函数,输入num的地址。
printf("%d\n",num); //输出变量num值为4
}
//加一函数,将被操作数的地址输入,该数将被加一。
void add(int *num)
{
(*num) ++; //num自增1
printf("%d\n",*num); //输出变量num值为4
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询