C语言学习笔记(二)——数据类型

C语言数据类型

1.基本数据类型

C语言的基本数据类型有整型、实型和字符型。

整型

有符号:最高位的二进制位用来表示正负,0代表正数,1代表负数,默认就是signed类型的。

 无符号:所有的二进制位都用来表示数据,需要使用unsigned关键字来修饰。

由于无符号整数的unsigned关键字不能省略,所以使用无符号类型时会比较麻烦,而C标准委员会为了我们方便使用,所以在stdint.h头文件中对无符号位类型进行了重定义。  

另外,由于不同的系统数据类型所占存储空间长度有所差异,因此C语言提供了一个测定数据类型所占存储空间长度的运算符——”sizeof“,格式为:

        sizeof(类型标识符)  ||   sizeof(变量名)

如 sizeof(int)、sizeof(long) 可以分别计算出当前所使用的系统中每一个int 类型及long 类型数据所占的存储空间字节数。

实型 

数据类型占用空间取值范围
单精度:float4字节(3.4*10^-38 ~ 3.4*10^38)
双精度:double8字节(1.7*10^-308 ~ 1.7*10^308)
高精度:long double12/16字节

单精度实型小数点后六位有效、双精度实型小数点后16位有效,采用科学计数法存储,符号位+整数+指数,,在运算时需要进行格式转换,所以运算速度比整型要慢,所以编程时尽量使用整型。

字符型

C语言中字符类型的类型标识符为char。字符就是符号或图案,在计算机中是以整数形式存储的,当需要显示时根据ASCII表中对应的关系,显示出相应的符号或图案。

模拟(基本类型之外)

布尔:bool (类型是1 字节,值是 4 字节,在编译的时候实际是1 和 0

由于先有的C语言,后有的布尔类型,所以C语言在设计时,没有设计布尔类型,然后以打补丁的方式新增了布尔类型,需要包含stdbool.h头文件才能使用。

2.常量与变量

标识符

由系统所指定的标识符称为保留字或关键字,关键字有特定含义,用户不能再将它当作一般标识符使用。C语言有32个关键字:

数据类型有关:
基本类型:void、char、short、int、long、float、double
复合类型:struct、union、enum
类型限定:auto、unsigned、signed、const、static、volatile、register、extern、typedef、sizeof
流程控制有关:
分支:if、else、switch、case、default
循环:for、while、do
跳转:goto、break、continue、return

常量

常量就是程序运行过程中不能变化的量,c语言的常量有:字面值常量、宏常量、枚举常量

下面列举了整型常量、实型常量和字符常量,这些都属于字面值常量:

‘a’ ——char 类型的字面值常量

100 ——int 类型的字面值常量

3.14 ——double 类型的字面值常量

100u —— unsigned int 类型的字面值常量

100l —— long 类型的字面值常量

100lu —— unsigned long 类型的字面值常量

100llu —— unsigned long long 类型的字面值常量

3.14f —— float 类型的字面值常量

3.14l —— long double 类型的字面值常量

除了这些,还有一个字符串常量,它是用一对双括号括起来的字符序列,如“Hello World”,字符串常量中可以包含汉字。每个字符串常量有一个字符串结束标志 “\0” 隐藏在串最后,标志着该字符串结束,由系统自动添加。一个字符串中字符的个数称为该字符串的长度(不包括串结束标志),但计算内存占用空间时要加上串结束标志。

注意:双括号括起来的是字符串,双括号内可以不含任何字符,如 “” 表示空串;单引号括起来的是字符常量,除转义字符外,引号内必须有且仅有一个字符。

变量

变量就是在程序运行过程中,可以变化的量,是用来存储数据的容器。

定义:类型标识符 变量名

变量名的取名规则 :

1. 只能由字母、数字和下划线组成
2. 只能由字母和下划线开头
3. 不能与32个关键字重名
4. 见名知意

变量的使用:

存储数据: 变量 = 12;

参考运算: 变量*3;

变量的属性:

作用域:变量可以使用的范围。

存储位置:在内存中分为不同的段,不同类型变量使用不同的内存段。

生命周期:变量从定义到释放(销毁)的时间段。

进程的内存分段:

text 代码段(只读段):c语言代码会被翻译成二进制指令(由r - x 存储),当程序执行时,二进制指令会被加载到该内存段中,该内存段是只读的,且强制修改就会出现段错误,一些常量数据(由r - - 存储)也会存储到该内存。

data 全局数据段初始化过的全局变量和静态变量会使用该内存段。

bss 静态数据段未初始化过的全局变量和静态变量会使用该内存段,在程序执行前,该内存会被初始化为0,因此,全局变量和静态变量默认值为0。

stack 栈局部变量、块变量会使用该内存段,容量有限,使用过多会产生栈崩溃、段错误。

heap 堆需要程序员手动管理,特点是足够大。

注意:可以使用size ./可执行文件名 命令查看可执行文件的代码段、全局数据段、静态数据段的大小(代码编译完成后就确定下来了,不会变化),栈、堆会随着程序的运行动态改变。

变量的分类:

全局变量定义在函数外的变量。

        作用域:整个程序中都可以使用。

        存储位置:初始化过的全局变量存储在全局数据段(data),未初始化过的全局变量存储在静态数据段(bss)。

        生命周期:从程序运行开始就定义完成了,到程序执行结束才释放。

局部变量:定义在函数内的变量。

        作用域:只能在它所在的函数内使用,出了函数就不能使用了 。

        存储位置:存储在栈内存。

        生命周期:当函数被调用并执行到变量的定义语句,到函数执行结束变量就会被释放。

块变量:定义在 if 、 for 、 while 、 do while 语句块内的。

        作用域:只能在它所在的语句块内使用,出了大括号就不能使用了。

        存储位置:存储在栈内存。

        生命周期:当函数被调用并执行到变量的定义语句,到出了它所在的大括号变量就会被释放。

注意点:全局变量、局部变量、块变量之间可以重名,但局部变量会屏蔽同名的全局变量;块变量会屏蔽同名的全局变量和局部变量。

修饰变量的关键字:

auto:早期用来定义自动分配、释放内存的变量(也就是局部变量和块变量),但随着实际编程中局部变量、块变量用的非常多,所以就默认不加就代表加。在C语言中该关键字基本没什么用;在C++中,可根据变量的初始化值的类型自动设置变量的类型。

注意:它不能修饰全局变量,因为全局变量在程序运行中不能被释放。

typedef:变量一旦被它修饰,就会变成一种类型,它可以给类型名过长的类型重新取一个简短的名字,例如:size_t time_t uint8_t uint16_t 等。

const:给变量提供一种保护机制,被它修饰过的变量不能显示修改,但并不确保变量百分百不能被修改;而存储在data内存段的变量被const修饰的话,内存位置就改为了text内存段,就成了常量,就可以百分百不能修改了。

注意点:在C++编译器中,变量一旦被const 修饰,那么就默认该变量不会被修改,系统就不会读取该变量在内存中的值。如果在这个变量前再加入 volatile 修饰的话,那么系统就会读取该变量在内存中的值。

static:三大功能——限制作用域、改变存储位置、延长生命周期。

1. 限制作用域:把全局变量、函数的作用域限制为它所在的. c文件内。

例子:在b.c 中定义的函数、全局变量在a.c 中是可以使用的,但如果b.c 中的函数、全局变量被static修饰后,a.c 中就不能再使用了。

作用:可以防止命名重复,造成冲突。

2.改变存储位置:把局部变量、块变量的存储位置由stack 改为 bss 或data。

3.延长生命周期:把局部变量、块变量的生命周期改为从程序开始执行到程序执行结束,意思就是局部变量、块变量不会随着函数的执行结束而释放。被static 修饰的变量成为静态变量,如果没有初始化,默认值为0。

register:变量一般都使用内存条作为存储介质,而被register修饰的变量会申请存储到CPU寄存器中,如果申请成功,该变量的使用速度会贼拉快~~~。但由于CPU中的寄存器数量有限,申请不一定百分百成功。申请成功的变量称为寄存器变量,为了不暴露其他寄存器的位置,这种变量不能取地址。

volatile:当在代码中第一次使用一个变量时,系统会从内存中读取该变量的值;如果后续该变量没有被当前代码改变,此时系统不会再从内存中读取变量的值,而是直接使用上次读取的值,这是系统为了提高程序的执行速度而进行的优化,但是当这个变量被多方共享时,这时变量的值就会出现错误。

特点:不稳定、易变的,如果变量被volatile修饰,系统将不会优化该变量的读值过程。

extern:用于声明全局变量,如果在a.c 中想使用 b.c 中的全局变量,需要在a.c 中声明该全局变量。

注意:声明变量时不能赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值