C语言“局部变量作用域”的问题
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
}
为什么不对呢?哪里不对呢? 展开
这个题目先打印4,再打印3,运行正常呀,哪里不对了??
不是变量作用域问题,而是函数调用的形参与实参问题:
先看add函数,它需要一个整型变量做参数,参数的名字是num,这个num叫形参。注意函数的形参只在函数内部有效。
再来看主函数,它在调用add函数时,使用的参数也是num,这个叫实参。它正好与形参的名字相同。实际情况是,不管形参与实参名字相同与否,调用时,系统都会建立一个新的贮存单元,并把实参的值放进去,类似形成实参的一个副本,那么这个贮存单元就是形参的贮存器,以后add函数形参所做的一切变化如赋值,均是对副本的操作,而不会影响实参那个贮存单元里存放的值。
本题恰好使用的相同名字的形参和实参,对人是一种迷惑。假定把形参变成除num之外其它名字的变量,主函数调用正常进行,你就会发现形参与实参的区别了。如:
void add(int);
main()
{
int num=3;
add(num); //用实参num调用add()函数
printf("%d\n",num); //输出变量num值为3
}
void add(int n)//n是形参,它单独贮存
{
n++; //n自增1。注意,在这个函数里,不能使用num这个变量,若写num++是不会运行的
printf("%d\n",n); //输出变量n值为4。注意这个值在函数运行结束时自动消失,更不会回传给num!!!!
}
你可以自己试一试。
2018-01-26
//你如果想让其自增应该传递一个指针或者返回处理后的值
//子函数中num 虽然和main里面num名字一样,但其实是在运行时创建的,作用域只在子函数中
//你也可以创建全局变量来实现子函数的处理
// 620812
# include "stdio.h"
void add(int);
void addPoint(int *num);
int addReturn(int num);
int main()
{
int Num=3;
add(Num); //调用add()函数
printf("%d\n",Num); //输出变量num值为3
addPoint(&Num); //调用add()函数
printf("addPoint(&Num) %d\n",Num); //输出变量num值为4
Num = addReturn(Num); //调用add()函数
printf("addReturn(Num) %d\n",Num); //输出变量num值为5
return 0;
}
void add(int num)
{
num++; //num自增1
//printf("%d\n",num); //输出变量num值为
}
void addPoint(int *num)
{
(*num)++; //num自增1
printf("addPoint :%d\n",*num); //输出变量num值为
}
int addReturn(int num)
{
num++; //num自增1
printf("addReturn :%d\n",num); //输出变量num值为
return num;
}
// 为什么不对呢?哪里不对呢?
这个程序其实问题很多,不只是局部变量作用域的问题。引起你自己误解的最主要一个原因是你把函数参数的变量名写成跟main函数里的变量一样。
试着把add函数的参数变量改个名字变成:
void add(int numa)
{
numa++; //numa自增1
printf("%d\n",numa); //输出变量numa值为4
}
再带入你自己写的主程序,就会发现其实main函数里的printf是在打印num,不是numa..........这是问题一,但是你不能因此把main函数里打印的变量改成numa哦,因为numa是add函数的局部变量啊~(这也就是你提出作用域的问题,numa只作用于add函数内部)
第二个问题,当你调用函数,又想要获得这个函数结果的时候,是需要函数返回一个你需要的值的,比如加一句return numa; 相应的,函数的类型要定义成对应的数据类型,而不是void:
int add(int);
main()
{
int num=3;
num=add(num); //调用add()函数
printf("%d\n",num); //输出变量num值为3
}
int add(int num)
{
num++; //num自增1
printf("%d\n",num); //输出变量num值为4
return num;
}
你可能会发现我并没有用numa,其实名字一样是可以的,因为变量有各自的作用域,初学阶段建议还是使用不一样的变量名。
函数add(int num),将形参 num加1
我们可以这样理解:
1、add(int num)函数执行时,将num=3抄下来,另存到函数内部,名为int num的变量中
这个变量是add函数内部的变量,不是外面的变量,只是将外部变量的值传给它
2、在add(int num)函数内部,不论对内部的变量做什么操作,都不影响外面的变量,本质上这就不是1个变量
3、例如,这个函数还可以这么调用呢,add(3);这样,也是将常数3传给内部变量int num
C语言中,函数的数值传递常用的有两种方法:变量传递、指针传递。
显然,你使用的是变量传递。
add(num); 这个函数的作用是传入一个数值,然后这个数值加一。注意,这里仅仅是对传入的数值3进行加一,不是对main()函数中的num变量加一。所以无论你在add(num)函数中对传入的数值做任何操作,都不会改变main()函数中的变量num。