黑马程序员——c语言学习—变量作用域

来源:互联网 发布:xp系统修复软件 编辑:程序博客网 时间:2024/05/22 00:51

                                          -----------Java培训Android培训IOS培训.Net培训、期待与您交流!------------ 

有关变量作用域的总结


1.全局变量

全局变量,也称外部变量,在函数体外定义,不是哪一个函数所特有。全局变量又可以分为外部全局变量和静态全局变量,他们最大的区别在于,使用static存储类别的全局变量只能在被定义的源程序文件中使用,而使用extern存储类别的全局变量不仅可以在被定义的源程序中使用,还可以被其他源文件中的函数引用。如果要在函数中使用全局变量,那么通常需要作全局变量的说明。只有在函数内经过说明的全局变量才能被使用。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。

定义如下:

#include <stdio.h>int a=0; //全局变量定义并初始化void print(void){printf("global variable a=%d\n", a); //函数体内可以访问}int main(void){print();//执行函数return 0;}
需要注意的是,如果在另一个文件内需要访问这个全局变量,或者在这个变量定义之前需要用到他,需要用extern关键词来做声明:

#include <stdio.h>    extern int a; // 声明另一个文件中存在的全局变量    void test(){      a = 12;   //源文件外访问全局变量} 

2、局部变量
局部变量是定义在{}内的普通变量,用auto来修饰(一般可以省略),所以又称为自动变量,局部变量只在{}内定义后有效,{}结束后自动销毁,存储在栈空间(一级缓存)内,他的作用域只限于这个{}内,定义如下:

void test(){    auto int a; // 可以和全局变量重名,在此之后,访问的a都是局部变量    int b; // 省略auto(一般用法)        register int c; // 告诉编译器采用寄存器的方式存储变量(速度快,但是会不会做取决于编译器)}

3.静态变量static

关于静态变量,值得注意的一点是,它的生存期是从程序开始运行到程序结束。静态变量不属于动态变量,是静态存储。

静态局部变量的生存期虽然是从程序开始运行到程序运行结束,但是他的作用域并不会因此改变,而且仍然与其作为自动变量的作用域相同。静态全局变量的特点是,它只能在被定义的源程序中使用,即它只能被本源程序文件的函数调用,而不能被其他的源程序文件的函数调用。

下面演示一下静态局部变量的使用

#include <stdio.h>void print(void){static int a=0; //静态局部变量的定义printf("静态局部变量a=%d\n", a++);//调用局部变量}int main(void){print(); //执行打印函数print(); //再次执行打印函数return 0;}

运行结果:

静态局部变量 a=0静态局部变量 a=1
分析运行结果可以得知,静态局部变量在初始化以后,再次执行该函数时静态局部变量保存的是上一次运行结果


4.const修饰变量

const修饰词修饰的变量(全局、局部、静态),在其生命周期内无法被修改。可以保护被修饰的内容,防止其被意外修改,增强程序的健壮性,const常量在初始化的时候必须赋值。编译器通常补位普通const常量分配空间,而是将它保存在符号中,这使它成为了一个编译期间的常量,没有存储与读内存的操作,它的效率也是很高。

常用的使用场景如下:

const int a =5;  //定义a为不可修改的常量int const a=5;  //定义a为不可修改的常量const int *p; //p可变,p指向的对象不可变int const *P; //P可变,p指向的对象不可变int *const p;//p不可变,p指向的对象可变const int * const p;//指针p和p指向的对象都不可变

5.volatile修饰符的作用就是告诉编译器不要对它所修饰的变量进行任何优化,每次取值都要从内存地址中去读取。嵌入式开发中经常跟中断、底层硬件打交道,volatile经常用到。






0 0
原创粉丝点击