<1>本地变量
(1)本地变量的定义
- 函数每一次运行都会产生一个独立的变量空间,在这个变量空间中的变量是函数此次运行中独有的变量,称为本地变量;
- 定义在函数内部的变量就是本地变量;
- 参数也是本地变量;
(2)变量的生存期和作用域
-
生存期:从变量开始出现到变量消亡的时间;
-
作用域:在代码的什么范围内可以访问这个变量(变量有作用);
——————对于本地变量,二者的答案统一:大括号内
1):我们在此处以一段代码为例对生存期和作用域的概念进行理解:
#include<stdio.h>
void swap(int a,int b);
int main(){
int a=5;
int b = 6;
swap(a,b);
printf("a=%d b=%d\n",a,b);
return 0;
}
void swap(int x,int y){
int t=x;
x=y;
y=t;
}
-
操作方法:我们利用devc++进行调试,判断标准为编译器是否给出Not found in current context的指令,若给出这条指令,则证明这个变量不存在。
-
结果:我们可以观察到:当停留在main函数中,a,b的值存在,x,y,t的值不存在;而停留在swap函数中时,我们发现x,y,t的值存在,而a,b的值不存在
-
注意:我们处在某一函数块中时,只有此函数块中的值能显示,非此函数的值不显示,但不代表不存在,只是不能在当前的上下文访问它们——————生存期仍然存在,作用域不存在。这个概念就与本地变量的定义相互呼应。
-
重点:在我们进行函数调用时,进行的操作是从一个变量空间进入另一个变量空间,每个变量空间中进行的操作互不影响
(3)本地变量的规则
- 本地变量是定义在块内的(即{}中),它可以定义在函数块中,也可以定义在语句块中
1)我们以一段代码为例
if(a<b){
int i=10;
}
——————在这段代码中,我们在if语句块中定义了一个整型变量i,整型int的生存期和作用域仅在if这个块中存在
2)同时我们甚至能随意使用大括号来定义变量
我们的大括号可以不依附任何语句,在这个大括号中定义的变量可以进行参与运算,输出等操作;
3)程序进入对应块之前,其中的变量不存在,离开这个块,其中的变量消失
4)在函数块外定义的变量在里面仍然存在,但是在里面定义的变量出函数之后会消失
————我们以一段代码为例
int main(){
int a = 5;
int b= 6;
swap(a,b);{
int i=0;
printf("%d\n",a);
}
printf("a=%d,b=%d\n",a,b);
return 0;
}
-
我们可以看出定义的a,b变量是在swap函数块外的,但是运行结果输出了a,b的值,这就证明了————在函数块外定义的变量在函数中仍然存在
5)块里面定义了和外面同名的变量就掩盖了外面的
我们以一段代码为例:
nt main(){
int a = 5;
int b= 6;
swap(a,b);{
int a=0;
printf("%d\n",a);
}
printf("a=%d,b=%d\n",a,b);
return 0;
}
—————这段代码的运行结果是a=0,而不是外面同名变量a的值5,所以当内外变量名重合时,我们以块内变量为重
6)注意:我们能在块内外使变量同名,但是不能在同一语句块中定义两个同名变量
7)本地变量不会被默认初始化,会给出任意值
<2>函数细节补充
(1)函数无参数时的表现形式
进行判断:当函数无参数时,应该表达为
void f(void)
还是void f()
————二者的区别是参数表中是否有void
-
- 当我们在参数表中放入void,就是明确告诉编译器我们函数不接收任何参数;
-
- 参数表中不放入任何东西,在传统C中,它表示f函数的参数未知而不是没有参数
注意:在第二种情况中,我们的编译器会对f函数的类型进行猜测,这就意味着我们编译器猜测的变量类型可能与我们在函数中实际定义的类型不相符,编译就会出现问题,因此我们并不推荐第二种表达形式,而应该将参数表达清楚
(2)逗号和逗号运算符的区分
举例说明:
- f(a,b)————调用函数时的圆括号中的逗号是标点符号(传两个参数)
- f((a,b))—————而这里则是先进行内括号中的运算,再进行调用,内括号中的逗号就是运算符(传一个参数)
(3)函数中不允许嵌套函数
- C语言不允许函数嵌套定义(允许函数嵌套声明)
(4)关于main
- int main()也是一个函数;
- 判断是否需要写成int main(void)————不影响;
- return 0有意义————因为main是一个函数,return 0起到的作用是检查main函数返回的数据类型是否正确