C语言(1) 数据类型以及存储类型

  1. 存储大小单位
    bit 只能用来存储0或1
    byte (字节)= 8bit
    Kb 1024 byte
    Mb 1024 Kb
    Gb 1024 Mb
    Tb 1024 Gb

  2. 数据类型(32位操作系统)
    基本类型
    字符类型
    char 1字节 默认是有符号型 (arm编译器默认是无符号)
    unsigned char 无符号字符型
    signed 有符号字符型
    整形
    短整型 2字节
    short
    unsigned short
    signed short
    整型 4字节
    int
    长整型 4字节
    long
    长长整型 8字节
    long long
    实型(浮点型)
    float 单精度的浮点类型 4字节 有效数字位可达8位
    double双精度的浮点类型 8字节 有效数字位可达16位
    浮点数不可以直接是用(==)比较
    因为计算机中的数都是用二进制表示的,大部分十进制小数对应的二进制小数是无限小数,也就是说,计算机可以精确表示整数,但不能精确表示小数 通常浮点型数据的比较如下所示
    if(a3)应写成if(fabs(a-3)<le-6)
    if(a
    b) 应写成f(fabs(a-b)<le-6)
    fabs是求绝对值的函数,le-6是0.000001
    枚举类型
    enum 枚举变量的大小,实质是常数所占内存空间的大小 正常为4,同int一样
    构造类型
    数组
    char a[10] 内存大小 = 类型 x 数量
    结构体
    struct 需要考虑 内存的分配方式 尽量保证申请到的内存为2 , 4, 8的整倍数
    共用体
    union 内存大小是 共用体中所占内存最大的变量所占的内存
    指针类型
    char *p
    int *p

    … 指针的实质也是变量 也是地址 因此所占内存大小为4字节
    空类型
    void :不能使用空类型来定义变量
    :一般用在函数的返回值和函数形参的位置

  3. 内存区域
    下面展示一下 内存区于结构图
    |-----------------------------------
    |堆区:使用malloc函数分配的
    内存就在这个区间。
    |----------------------------------
    |栈区:用户的函数的执行,函数
    | 内部定义的局部变量,都在
    | 栈区。只能在当前函数中使用,其他函数无法使用
    |-----------------------------------
    |静态区|.data:
    | |存放的是已初始化的全局变量,
    | |static修饰的已初始化的全局变量。
    | |-----------------------------
    | |.bss(这里的初值都是0)
    | |未初始化的全局变量,static修饰的
    | |未初始化的变量
    | |-----------------------------
    | |.ro (.rodata)(只读的数据段)
    | |char *p = “hell world”;
    | |-----------------------------
    | |.text:存放程序代码
    | |
    |-------|-----------------------------

  4. 存储类型
    atuo static register extern volatile const 对变量进行修饰
    auto:(自动变量)(局部变量)// 当前括号内有效
    在定义变量的时候,如果变量没有指定其他的存储类型,变量就是auto的类型。
    非自动类型的变量:使用static修饰的变量或者全局变量就是非自动类型的变量。
    static:静态变量
    1.延长变量的生命周期
    2.限定作用域(对象可以是函数,也可以是变量)static修饰的变量或者函数只能在当前文件中使用

void func(void)
{
static int a=1;
static int b;
//如果a没有被static修饰,默认a在栈上存放
//当函数被调用的使用分配栈空间,当函数调用完
//栈就会被释放了。所有这里打印的a的值都是2

//如果加上了static修饰,并且static修饰的变量被
//赋值了,static修饰的变量在静态区种的.data存放着
//在函数执行结束的时候,data段不会被释放,所以打印
//的结果是2 3 4

//static修饰的变量如果没有被初始化,变量在.bss
//段存放着
a++;
 printf("b= %d\n",b);
printf("a = %d\n",a);
}

extern:可以用来声明变量或者函数是在其他文件中
用法如下:
在add.c中
int add(int a,int b)
{
return(a+b);
}
在01extern.c调用
extern int add(int,int);
printf(“sum= %d\n”,add(100,200));
const:(只读的变量)
问题:const修饰的是常量?
答案:不对
问题:const修饰的变量在rodata段吗?
答案:不完全正确,因为const修饰的全局变量
const int a=10;
a=100; #编译在编译的时候就会对const修饰的
#变量检查,如果重新赋值了,直接报错

const int *p=&a;或 int const *p=&a;
p指向地址中的值不可以修改
p指向的地址是可以修改的

int * const p=&a;
p指向地址中的值可以修改
p指向的地址是不可以修改的

const int * const p=&a;
p指向地址中的值不可以修改
p指向的地址是不可以修改的

将const修饰的变量地址赋给 非const类型的指针时需要强制转换 否则会报警告

const int a=10;
int *p = (int *) &a;  这里需要注意,这种赋值方式会改变a不可变的定义   
最好使用    const int* p=(int *) a;

volatile:(易变的)多用来修饰硬件中寄存器的地址
volatile int a;
1.防止编译器对代码进行优化:-O3
volatile int *a=&b;
*a= 110;
*a= 120;
2.防止cpu值取数据从缓存中取(cache register)
volatile修饰的变量每次都从内存中取出(取出最新的值)

在开发过程中什么时候需要定义变量的时候需要加volatile

1.在定义硬件地址的时候。(比如:状态寄存器)
2.在中断处理函数中访问的非自动 变量时,需要添加volatile
3.多个线程访问的同一个变量

第1题:向0x80000000地址中写入0x12345678值
volatile unsigned int *p=(volatile unsigned int *)0x80000000
*p=0x12345678;
register:(寄存器)

register int a;(寄存器类型的变量)
定义的register类型的变量要比不加register的时候执行的速率要快。

问题:寄存器类型的变量执行的速率快,能不能把所有的变量都定义成寄存器类型的变量?
答案:不能,在芯片内部寄存器是有个数限制的, 比如在A53硬件平台上只有40个寄存器。

问题:在定义变量的时候const和volatile能不能同时使用?
答案:可以的,只读的状态寄存器,但extern 不能跟static同时使用

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值