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
}
为什么不对呢?哪里不对呢? 展开
add函数里面的num是另一个变量,和主函数中的num不一样。它们两都是临时变量,除了变量名相同没有什么关系。
add函数只是通过参数的方式获取了主函数里面的num的值,也就是给了add中的num初始值,但是并没有把计算后的值返回给主函数中的num,所以主函数中的num并没有被改变
main()
{
int num=3;
add(num); //调用add()函数
printf("%d\n",num); //输出变量num值为3
}
//把变量名换一下就明白了,这个变量和num是两回事,和局部变量作用域没有半毛钱关系
void add(int aa)
{
aa++; //aa自增1
printf("%d\n",aa); //输出变量aa值为4
}
add函数中的num 是函数自己的形参 和主函数中的num同名不同地址。
你在add函数中无论怎么改变num 对主函数中的num没影响
如果要想传址
函数定义void add(int *num) 用指针
调用的时候add(&num);
做为C语言的过来人给你真正的解答,希望能帮到你!
你是想问为什么调用了add();函数后为啥在main()函数里面num值还是3,而在add();函数里面num变成了4对吧?
我从三个方面给你解答:作用域有三种:1代码块作用域 2函数原型作用域 3文件作用域
首先解答关于你标题问的关于“局部变量作用域”:因为你的变量是在函数内部声明的,就像你在main()函数里面声明的一样,它的作用域为代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾该变量均是可见的。
函数的性质你也需要明白,编写一个C语言函数基本分为三部分1.函数原型声明 2.函数调用 3.函数定义;你编写的add()函数就是这样。在函数原型声明中可以不写变量名因为对于编译器来说它只关心参数的类型和参数数目(函数原型的参量具有函数原型作用域,参量从声明开始到声明结束),而在函数定义中的变量如你写的void add(int num)中的num在函数定义中为也是属于局部变量,它也具有代码块作用域(尽管num在代码块的外部),而且这个add()函数中的num和你main()中的num不是同一个变量(你可以试着换其它名字结果还是一样)
在main函数中你调用了add(num);这个num为实参,而void add(int num)函数中的num为形参,这样做的目的是把main的num的值赋值给了add函数的形参num(而且这两个num不在同一个namespace里面所以你可以声明两个相同的num但是并不是同一个变量),你只是得到了数值的拷贝,也就是说你尽管改变了add()函数中的num但是并没有改变main()中的num,我想你应该还没学到指针,不用指针的方式也可以通过add()函数改变main()中的num; 你只需要这样写:
int add(int); // 这里我把函数的返回类型声明为了int
int main(void)
{
int num=3;
num = add(num); //调用add()函数 ,并把返回值赋值给num
printf("%d\n",num); //输出变量num值为4
}
int add(int num)
{
num++; //num自增1
printf("%d\n",num); //输出变量num值为4return num;
}有不懂可以继续问,希望能帮到你
而是传参方式.
add函数传值调用, 而不是传指针调用.
所以在add中改变形参num的值,不会影响主函数中实参num的值.
你的注释里面的输出是对的。
这个问题并不是探讨局部变量作用域的问题,而是函数是传值还是传址的问题。传值,指的是参数传递的过程中,传过去的参数实际传入的是这个变量的一个拷贝而不是这个变量本身。因为对变量拷贝所以对拷贝后的变量做任何更改都不会改变变量本身。如果需要改变变量本身,可以传递变量的地址过去,再修改地址里面的内容。这是指针的知识。以后你学到指针,你就会明白这个道理。下面附的代码是讨论作用域的问题。
int a =1;
main(){
printf("a1 = %d\n",a);
int a = 2;
{
int a =3;
printf("a3 = %d\n",a);
}
printf("a2 = %d\n",a);
}