C基础笔记3——数据类型与变量
在上一篇博客中,我们介绍了c语言的令牌,本文我们将会介绍c语言的数据类型以及变量。
文章目录
C中的数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。通俗点来说,就是规定了丰富的数据类型来描述生活中的各种数据。
C 中的数据类型可分为以下几种:
序号 | 类型与描述 |
---|---|
1 | 基本数据类型 它们是算术类型,包括整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。 |
2 | 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
3 | void 类型: 类型说明符 void 表示没有值的数据类型,通常用于函数返回值。 |
4 | 派生类型: 包括数组类型、指针类型和结构体类型。 |
由于学识所限,本文只解释基本数据类型
注意:
-
在c中没有字符串类型,如果需要表示字符串,则需要用字符数组char[]表示字符串;
-
在不同的系统上,部分数据类型字节长度不一样,例如int可以占两个字节或者四个字节。
1. signed 和 unsigned
C语言使用signed和unsigned这两个关键字修饰**字符型(char)和整型(int)**的
- signed表示一个类型带有正负号,包含负值
- unsigned表示该类型不带有正负号,只能表示零和正整数
因此,用通俗点的语言来说
- signed表示有符号的数字,例如海拔、温度等
- unsigned则表示无符号的数字,例如身高、体重等
以下是一些注意事项:
-
对于int类型,默认是带有正负号的,也就是说int等同于signed int,但由于这个是默认情况,关键字signed一般都不写,写了也不算错.
如果需要int类型不带正负号,只表示非负整数,则需要在前面加上关键字unsigned声明变量,如
unsigned int a
; -
unsigned int 里面的 int可以省略,所以上面的变量声明也可以写成这样
unsigned a
; -
C语言规定 char类型默认是否带有正负号,由当前系统决定。这就是说,char不等同于 signed char,它有可能是signed char,也有可能是 unsigned char。这一点与int不同,int就是等同于 signed int。
2.数据类型相关
c中的每一种数据都对其数据类型有了明确的定义,在内存中分配了不同大小的内存空间(使用字节多少表示)。
2.1 sizeof 函数
sizeof是计算变量在内存的占空间的大小,单位是字节(bit)
在使用sizeof函数时,需要添加头文件string.h
(1)使用sizeof查看数据类型占空间的大小
执行结果如上图所示
(2)使用sizeof计算基本数据类型变量的占用空间的大小
执行结果如上所示
注:代码行中划绿波浪线是因为vs编译器中建议使用%zd进行打印,之后会提及这些类型
2.2 整型
c语言的整数类型就是用于存放整数值的,比如 1,22 , -55等
整数的类型有:
类型 | 存储大小(单位为字节) | 值范围 |
---|---|---|
char | 1 | -128 即-(2^7) 到 127 (2^7-1) |
unsigned char | 1 | 0 到 255 (2^8 - 1) |
signed char | 1 | -128 即-(2^7) 到 127 (2^7-1) |
intsigned int (int) | 2/4 | -32,768 (- 2^15 ) 到 32,767 (2^15-1)或 -2,147,483,648 (- 2^31) 到 2,147,483,647 (2^31 -1) |
unsigned int | 2/4 | 0 到 65,535 (2^16-1) 或 0 到 4,294,967,295 (2^32 -1) |
short (signed short) | 2 | -32,768 (- 2^15)到 32,767 (2^15 -1) |
unsigned short | 2 | 0 到 65,535 (2^16 - 1) |
long (signed long) | 4 | -2,147,483,648 (- 2^31) 到 2,147,483,647 (2^31 - 1) |
unsigned long | 4 | 0 到 4,294,967,295 (2^32 - 1) |
整型的使用细节:
-
各种类型的存储大小与操作系统、系统位数和编译器有关,目前通用的以64位系统为主;
-
在实际工作中,c程序通常运行在linux/unix 操作系统下。大众则一般使用windows10(64位);
-
C语言的整型类型, 分为有符号 signed 和无符号 unsigned 两种, 默认是 signed;
-
C程序中整型常声明为int型, 除非不足以表示大数, 才使用long long
-
有关字节及其大小:
bit(位): 计算机中的最小存储单位。
byte(字节):计算机中基本存储单元。
- 1byte = 8bit [二进制再详细说, 简单举例一个 short 3 和 int 3 ]
short 3
在内存中占有 2字节int 3
在内存中占有 4个字节- 1KB = 1024Byte;1MB = 1024KB;从小打到依次还有GB、TB、PB等。
2.3 浮点类型
c语言中的浮点类型可以表示一个小数,比如22.2 , 3.3,-2.3等
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
float 单精度 | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位小数 |
double 双精度 | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位小数 |
注:E(n)代表10的n次方
注:
- 关于浮点数在机器中存放形式的简单说明:浮点数=符号位+指数位+尾数位 , 浮点数是近似值
- 尾数部分可能丢失,造成精度损失。
浮点型的一些使用细节:
-
浮点型常量默认为double型 , 声明float型常量时, 须后加‘f’或‘F’。
-
浮点型常量有两种表示形式
-
十进制数形式:如: 5.12 512.0f .512 (必须有小数点)
-
科学计数法形式:如: 5.12e2 、 5.12E-2
-
-
通常情况下,应该使用double型,因为它比float型更精确。
-
printf("d1=%f ", d1); // 在输出时,默认保留 小数点6位
2.4 字符类型
字符类型可以表示单个字符,字符类型是char
, char
是1个字节(可以存字母或者数字),多个字符称为字符串, 在C语言中 使用 char
数组 表示,数组不是基本数据类型,而是构造类型。
字符类型的一些使用细节:
-
字符常量是用单引号(‘’)括起来的单个字符。 例如:
char c1 ='a'; char c3 = '9'
; -
C中还允许使用转义字符
‘\’
来将其后的字符转变为特殊字符型常量。例如:char c3 = ‘\n’; // '\n'表示换行符
,转义后的字符总体为一个; -
在C中, char的本质是一个整数,在输出时,是ASCII码对应的字符;
-
可以直接给char赋一个整数,然后输出时,会按照对应的ASCII 字符输出;
-
char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码。
char c1 = 'a'; char c2 = 'b';
字符类型的本质:
-
字符型存储到计算机中,需要将字符对应的ASCII码值(整数)找出来:
-
存储:字符’a’——>码值 (97)——>二进制 (1100001)——>存储
-
读取:二进制(1100001)——>码值(97)——> 字符’a’——>读取(显示)
-
-
字符和码值的对应关系是通过字符编码表决定的(规定好)。
2.5 布尔类型
- C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真
- 但这种做法不直观,所以我们可以借助C语言的宏定义 。
- C语言标准(C99)提供了_Bool 型, _Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1, C99还提供了一个头文件<stdbool.h> 定义了bool代表_Bool, true代表1, false代表0。只要导入 stdbool.h ,就能方便的操作布尔类型了 , 比如 bool flag = false;
- 条件控制语句; if
- 循环控制语句; while …
3.变量
3.1 变量的创建
在我们了解清楚c中的数据类型后,就需要用数据类型来创建变量。
C语言中把经常变化的值称为变量,不变的值称为常量。
创建变量的语法形式为:
int age
char zh
double weight
变量在创建的时候给其一个初始值,就叫初始化
int age = 18;
char ch ='w';
double weight =48.0;
unsigned int height = 100
为什么创建变量的时候最好要对其进行初始化?
一段程序结束后,操作系统会对其进行内存回收,但是不会清理该空间内存在的遗留数据,该数据成为垃圾数据。所以在给变量分配内存时,很可能这段内存存在着以前其他程序留下的值。当使用VC编译器时,若编译器发给该变量没有赋值就使用了,就会默认填充一个以”85”开头很大的数字,该数字称为“填充数”,表示该变量没有进行初始化。
所以我们通常对变量,分配好存储空间之后都要对该内存空间进行初始化。原文链接:https://blog.csdn.net/Mr_zhao11/article/details/71023439
3.2 变量的分类
- 全局变量:在大括号外部,在整个工程中都可以使用
- 局部变量:在大括号内部,只在局部范围内使用
如果全局变量和局部名字相同呢?
由示例可见,局部变量会被优先使用,遵从“就近原则”。
3.3 变量的存放
变量创建的本质是:在空间中申请一块空间
内存中存在三个区域,分别是栈区、堆区和静态区。
- 栈区:局部变量存放地
- 静态区:全局变量存放地
- 堆区:动态内存分配,malloc、free、calloc等
关于这部分的讲解,CSDN上有很多优秀的文章,下面举例两个
- C语言程序里全局变量、局部变量、堆、栈等概念_全局变量和栈空间-CSDN博客
78-blog-110391819.235v43pc_blog_bottom_relevance_base9&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogOpenSearchComplete~Rate-4-110518378-blog-110391819.235v43pc_blog_bottom_relevance_base9&utm_relevant_index=9)- C语言程序里全局变量、局部变量、堆、栈的存储区域_全局变量在栈区还是堆区-CSDN博客