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作比较。
变量:在程序运行过程中其数值可以改变的数据
定义的一般形式:
存储类型:数据类型变量名;
存储类型:决定了变量的存储位置
数据类型:决定了变量的存储大小
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作比较。
相关文章推荐
- C语言 数据类型修饰符与存储类修饰符
- C语言中数据类型转换的学习
- c语言基本数据类型
- C语言数据类型(4.21)
- C语言基本数据类型及其扩展和可移植性问题
- C语言的数据类型汇总
- C语言数据类型
- C语言中的数据类型及其转换详解
- C语言基本数据类型大小
- C语言 数据类型占多少字节,指针占多少字节
- <关于数据类型的一些看法---C语言版本>
- C语言-数据类型(整型)
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- 笔记--关于c语言中各种数据类型所占字节。
- C语言的数据类型
- C语言中强制数据类型转换的总结
- C语言指针剖析(1)---基本数据类型
- c语言32个关键字_数据类型
- C语言博客作业--数据类型
- C语言博客作业--数据类型