一、作用域
就是一个变量或者函数起作用的地方。
一个c语言变量的作用域可以是代码块作用域、函数作用域或者文件作用域。
(1)代码块作用域:代码块是{}之间的一段代码。
int main(void) { int a = 0; a = 10; { int a = 100;//此处a的作用域是在这个{}范围内 } printf("a = %d\n", a);//这个a表示的是a=10的值。 return 0; }
eg2: int main(void) { int a = 0; a = 10; { int a = 100; printf("a = %d\n", a); } return 0; }
注:出现在{}之外的变量是全局变量
二、auto关键字
auto 自动变量,c语言的默认变量都是auto,可写可不写。
auto int a = 0;等同于 int a = 0;
三、register寄存器变量
通常变量在内存中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高
register int i = 0;//建议,若有寄存器空闲,那么这个变量就放到寄存器里面使用
注:对一个register变量是不能进行取地址操作的
四、代码块作用域的静态变量
静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问。
int mystatic() { int a = 0; printf("a =%d\n", a); a++; //a++只能在这个{}内访问 } int main() { int i; for(i = 0; i < 10; i++) { mystatic(); } return 0; }
int mystatic() { static int a = 0; //静态变量,只初始化一次(即只在开始时运行了一次,后面不管运行几次都跟它无关),且程序运行期间,静态变量一直存在 printf("a = %d\n", a); a++; } int main() { int i; for(i = 0; i < 10; i++) { mystatic(); } return 0; }
注:函数通常是全局的,而一旦用static进行限制,即:
static void test()
{
}
那该函数就只能在当前这个文件中使用,不能被别的文件调用。
五、代码块作用域外的静态变量(即全局变量)
代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问
六、extern 跨文件作用域
当想调用另一个文件中的某个变量时,需要用extern在本文件中声明。
比如:想在本文件中调用a.c文件中的mymax变量,在程序的开头加下面这一句
extern int mymax;
不加extern,则表示全局变量。