您的位置:首页 > 编程语言 > C语言/C++

C语言数据类型的修饰符

2017-08-18 21:40 120 查看
概述:C语言操作对象是内存资源,对内存资源存放位置的限定

变量:在程序运行过程中其数值可以改变的数据

定义的一般形式:

存储类型:数据类型变量名;

存储类型:决定了变量的存储位置

数据类型:决定了变量的存储大小

1、auto自动变量,位于普通内存,可读可写区域。默认情况下使用的是auto,如果变量在{}中,则变量存放于栈空间。

2、register

int a; ==》可读可写的内存上

register int a; 限制变量定义在寄存器上的修饰符用于定义一些快速访问的变量

实际上是中看不中用的修饰符,编译器会尽量的安排CPU的寄存器去存放a,如果寄存器不足时,那么a还是放在存储器中(内存)

内存(存储器)与 寄存器的关联:

微软推出一些不同的CPU,频率一样,价格差异很大,基本上都是和内部寄存器的数量有关,随着内部寄存器数量的增加,运行速度大幅提升,其成本相对也提高了很多。

内存是有地址的,寄存器是没有地址的,因此,取地址符&对register变量是非法的(即使最后使用的不是寄存器)

3、static

静态变量==》存放于静态区的变量

应用场景:

(1) 函数内部的变量

int fun()

{

int a; ==》 static int a; a存放于数据段,全局存在,局部可见

}

(2)全局变量(函数外部的变量)

int a; ==》static int a; a存放于数据段,全局存在,全局可见

int fun()

{

……

}

(3)函数的修饰符

int fun() ==》static int fun()

题外:

int main()

{

printf(“the address of main is %d\n”,main);

}

编译会报类型不匹配的警告,但是编译能过,main的地址能打印,这说明main是一种类型,可以用类型修饰符修饰的

4、extern

外部声明

5、const 常量的定义

const int a = 100; 只读的变量,但是还是有办法去改变(指针技巧)

假定内存中有两块区域,一块的属性是WR,一块的属性是R,则R属性区域的内存里存放的内容是不能修改的,但是const修饰的变量存放的区域属性是WR而不是R,其不可修改的属性是由编译器去控制的,而不是内存的属性

6、volatile

告知编译器编译方法的关键字,不优化编译

告知编译器:被修饰变量的值的修改,不仅仅可以通过软件,也可以通过其它方式(硬件修改)

举例:

int a = 100;

while(a == 100);

myfun();

==》汇编代码:

F1: LDR R0 , [a] [a]代表a的地址,将a的值从内存送到R0寄存器

F2:CMP R0, #100

F3:JMPEQ F1 编译器开启优化后 JMPEQ : F2

F4:myfun()

由于在while循环中没有对a操作,因此编译器会认为内存中的变量a不会发生变化,因此会有优化,不会去内存中读取a的值与R0作比较。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: