【C语言学习记录5】变量属性

C语言中的变量可以有自己的属性;

在定义变量的时候加上“属性”关键字;

“属性”关键字指明变量的特有意义;

语法:

       property type var_name

示例:

全局变量存储在静态存储区。

什么是静态存储区:

内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

什么是栈:

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

auto关键字

(只修饰局部变量)

auto即C语言中局部变量的默认属性;

auto表明将被修饰的变量存储于栈上;

编译器默认所有的局部变量都是auto的;

示例:

 

register关键字

寄存器变量的意义是请求编译器将这个变量存储与寄存器中,而不是内存中。寄存器个数是有限的,故不可能将程序中所有变量都声明为寄存器变量。所以在C语言中,register关键字只是请求,但不一定成功。

1register关键字指明将局部变量存储与寄存器中;

2)register只是请求寄存器变量,但不一定成功;

3)register变量的必须是CPU寄存器可以接受的值;

4)不能用&运算符获取register变量的地址;

(取址运算符取的是内存的地址)

全局变量的生存周期是程序运行到程序结束,如果说全局变量占据了寄存器,代表从程序开始到结束都要占用这个寄存器,由于寄存器变量有限,长时间占用,会导致CPU无法正常工作。

那么为什么请求不一定成功?

寄存器的访问速度比内存的快得多。(C语言为了追求效率而有的)

示例:

static关键字

static关键字指明变量的“静态属性”

- static修饰的局部变量存储在程序静态区。(从栈上挪到静态数据区,生命周期和全局变量相同,只是作用域是局部的)

static关键字同时具有“作用域限定符”的意义;

- static修饰的全局变量作用域只是声明的文件中;

- static修饰的函数作用域只是声明的文件中;

示例:

varsvar作用域一样,但是生命周期不同。

1)存储在静态数据区

2)仅在第一次调用时自动初始化为0

3)第二次调用保留上次的值

4)静态局部变量生命周期为程序运行期,因为存在静态存储区

5)文件作用域标识符

实验分析:

源码:

 

结果:

extern关键字

1)extern用于声明“外部”定义的变量和函数:

- extern变量在文件的其他地方分配空间;

- extern函数在文件的其他地方定义;

(告诉编译器这个变量是存在的)

2)extern用于“告诉”编译器用C方式编译:

       C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器“以标准C方式进行编译”。

示例:

 

小结:

函数和全局变量在C语言中可以跨文件引用,也就是说他们的连接范围是全局的,具有文件连接属性,总之意思就是全局变量和函数是可以跨文件看到的(直接影响就是,在a.c和b.c中各自定义了一个函数func,名字相同但是内容不同,编译报错)

定义函数都必须在外面,不能在一个函数里面定义别的函数,所以没有局部函数,只有全局函数。

void func1(void)

{

int a;  

void func2()

{    

int b; 

}

}            //编译报错

 

猜你喜欢

转载自blog.csdn.net/haibing_x/article/details/94411434