c语言中的修饰符

1.static:

1.修饰局部变量,首先只要是函数里面的,包括main函数里面的都是局部变量,只有函数外面的才是全局变量,

局部变量一般在该函数运行结束时就消亡了,因为这个函数的栈帧此时已经被释放了。但是如果加上 static关键字

存储在数据区,而不是栈的位置,只被初始化一次,当该函数再次被调用时,使用的还是这个变量开始的值,不会被改变。且函数运行结束,它也不会被释放,直到整个进程结束。这个特点跟全局变量很像,但全局变量是所有的函数都能访问到,这里只有这个函数可以访问到。

2.修饰全局变量和函数

此变量或函数只在当前文件可见。相当于缩减可用范围。非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

static 只被改变一次,const不可改变,全局变量可以改变多次。

const:

1.修饰变量:

表示修饰的这个变量的值是不可以改变的

2.修饰指针:

char * const pContent;  

const (char*) pContent; 

表示这个指针(地址)本身就是常量,不可以改变

2)指针所指向的内容是常量不可变

const char *pContent;  

char const *pContent;  

表示指针中的数值是不可以改变的

3)两者都不可变

const char* const pContent;

3.修饰函数中的参数

1)const修饰函数参数

a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var); 

b.参数指针所指内容为常量不可变

void function(const char* Var);  

c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)

void function(char* const Var); 

像局部变量就是存放在栈区了,而数据区又分为

<1>只读数据段
只读数据段是程序使用的一些不会被更改的数据。一般是const修饰的变量以及程序中使用的文字常量一般会存放在只读数据段中。
<2>已初始化的读写数据段:
在程序执行时它们需要位于可读写的内存区域内,并且有初值,以供程序运行时读写。在程序中一般为已经初始化的全局变量已经初始化的静态局部变量(static修饰的已经初始化的变量),只存放这两种变量。
<3>未初始化段(BSS):
BSS段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
特点是可读写的,在程序执行之前BSS段会自动清0。所以即使全局变量和静态变量一开始不给初始值也没关系,因为会自动清零。

未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。与读写数据段类似,它也属于静态数据区。但是该段中数据没有经过初始化。未初始化数据段只有在运行的初始化阶段才会产生,因此它的大小不会影响目标文件的大小。在程序中一般是没有初始化的全局变量没有初始化的静态局部变量

3.register

寄存器变量,告诉编译器它所声明的变量在程序中使用的频率非常高,请编译器尽量将此变量放在寄存器中,这样程序执行速度更快。但实际上编译器不一定这么做,可以忽略此选项。

4.volatile

表示变量随时可能被修改,且系统对实时性要求很高,请一定从内存中读取内容,不要直接拷贝寄存器中的数据,有可能数据老旧。常见的使用场合包括中断服务程序和嵌入式系统的寄存器相关操作。

5.extern

关键字 extern 常用在变量和函数声明前,用来说明此变量或函数是在别处定义过的,要在此处引用。





猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/80807795