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
}
为什么不对呢?哪里不对呢?
展开
 我来答
百度网友5298263
2018-01-06 · TA获得超过968个赞
知道小有建树答主
回答量:1005
采纳率:94%
帮助的人:528万
展开全部
这是函数参数的引用传递和值传递的问题,你这种方法是值传递
其实main和add中的num并不是同一个
只是调用add的时候,把mian里面num的值复制给了add中的num
所以add中的num自增并不影响main的实参
你改成void add(int &num) 这样是引用传递,就可以看到效果了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
605557370
2018-01-20 · TA获得超过417个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:154万
展开全部
题主说的不对是哪个地方?
虽然在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的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
户哲茂5B
2018-01-11 · TA获得超过817个赞
知道小有建树答主
回答量:781
采纳率:59%
帮助的人:134万
展开全部
在main中int num;一次
在add括号中形参 int num;一次
这样的话这2个num虽然名字一样,但不是同一个变量。
也就是说。当你执行add(num),时候,这里的num是第一个num,值是3,但到了大括号里面,的num用的就是第二次申请的num变量,并且初始值等于add();
括号里的值。当add执行结束,形参num身为局部变量就会失效。以后出现的num就是第一个变量num;
不建议形参和局部变量名字和全局变量或者其他局部变量名字相同,容易混淆
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-06-15
展开全部
add(int )你传入的是一个值,不是地址,在函数里面是4,在外面变量值是没变的,是值传递,不是地址传递啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
happy19941128
2018-01-11 · TA获得超过132个赞
知道小有建树答主
回答量:147
采纳率:50%
帮助的人:13万
展开全部
//由于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    
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式