1、基本数据类型:
(1)char类型
空间大小: | 1 字节 |
取值范围 | -2^7 ~ 2^7 - 1(-128 ~ 127) |
表现形式 | char ch; |
存储对象 | 字符 |
存储类型 | 整型 |
需要说明:char类型主要用来存储的是字符,同时ASCII表也是在其上衍生出来。同时在使用这个数据类型的时候要注意类型转换和相关特定的操作函数,也要注意取值范围,其是循环取值。例如:129使用char类型的去输出,其数值可能输出的是 -127。
拓展:char类型用于储存字符(如,字母或标点符号),但是从技术层面看, char是整数类型。因为char类型实际上储存的是整数而不是字符。(《C primer plus》)
(2)short类型
空间大小 | 2字节 |
取值范围 | -2^15 ~ 2^15 - 1(-32,768 ~32,767) |
表现形式 | short sh; |
存储对象 | 数字 |
存储类型 | 整型 |
说明:这个数据类型主要使用于数据值相对较小的地方,因为其范围大小偏小(相比int),常使用于内存优化方面。
(3)int类型
空间大小 | 4字节 |
取值范围 | -2^31 ~ 2^31 - 1(-2,147,483,648 ~ 2,147,483,647) |
表现形式 | int a; |
存储对象 | 数字 |
存储类型 | 整型 |
说明:int类型是最常用的整数类型,因为它在大多数现代计算机中都是最优化的,并且在内存使用和性能之间提供了良好的平衡。
(4)long(int)类型
空间大小 | 8字节 |
取值范围 | -2^63 ~ 2^63 - 1()-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
表现形式 | long a; |
存储对象 | 数字 |
存储类型 | 整型 |
说明:long是一种数据类型,用于声明可以存储更大范围整数值的变量.在C99和C11引入了long long类型,目的也是方便存储更大的数值。
(5)float类型
空间大小 | 4字节 |
取值范围 | ±1.18e-38 到 ±3.4e+38 |
表现形式 | float f; |
存储对象 | 小数 |
存储类型 | 浮点型 |
存储精度 | 7~8位小数 |
说明:float 是一种数据类型,用于声明浮点数变量,即可以表示小数和分数的数值。在使用是要注意精度的取值,以免造成精度丢失
(6)double类型
空间大小 | 8字节 |
取值范围 | 10^-308 ~ 10^308 |
表现形式 | double d; |
存储对象 | 小数 |
存储类型 | 浮点型 |
存储进度 | 15 ~ 17 位小数 |
说明:double是一种数据类型,用于声明双精度浮点型,精度相比float更高。
2、枚举(enum)
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。
定义格式:
enum 枚举名 {枚举元素1,枚举元素2,……};
每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。例如:
enum weekday{MON, TUE, WED, THU, FRI, SAT, SUN};
在没有指定时一个整数值时,MON的值是 “0”,其后一次递增(TUE = 1,WED = 2 … …)
在指定一个整数值时,例如:
enum weekday{MON=1, TUE, WED, THU, FRI, SAT, SUN}
那么就从1依次递增。
用处: 可以使用在switch-case选择中,更有层次和识别感
枚举类型和switch语句经常一起使用,因为枚举提供了一组命名的常量,而switch语句可以基于这些常量的不同值执行不同的代码块。这样可以使代码更加清晰和易于维护,特别是当有多个可选状态或情况需要处理时。
注意点:命名规则、适用范围等等
3、空类型(void)
类型说明符 void 表示没有值的数据类型,通常用于函数返回值。
也可以表示任意类型。
4、派生类型
(1)数组类型( [] )
可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的地址在声明后地址是连续的。
数组中的特定元素可以通过索引访问,第一个索引值为 0
数组是存放一系类相同的数据类型的数据结构
定义格式:
数据类型 标识符 [长度] ;
初始化:
1)数据类型 标识符 [长度] = {0,……};
2)数据类型 标识符 [长度];
标识符[长度] = {0,……};
数组(静态)的空间大小如何求?
数组的大小:sizeof(table)/sizeof(table[0])
多维数组
定义格式:
数据类型 标识符 [长度][长度][长度][长度]…
数组通过下标或者索引来进行查找,同时数组名代表首地址,是一个地址(使用“[]”可以解地址)
数组分为静态数组(直接定义的)和动态数组(malloc来动态分配空间,同时还要释放free)
例如:
静态:int a[5] ={1,2,3,4,5}; ----------------- 长度是五
动态:int size = 5;
int *a = (int * )malloc(size * sizeof(int))
free(a);
注意点:在使用字符数组时,要注意常量区、字符串 == 字符数组、结束符 “\0”等
(2)指针类型( * )
指针是一个非常强大的特性,它允许程序员直接操作和管理内存地址。指针变量存储的是另一个变量的内存地址,而不是数据值本身。指针本身就是地址,存储的也是地址。
在使用时,通常涉及到我们的作用是为了值传递还是地址变量传递
同时指针的空间大小是固定的且和其PC机的CPU位数相关。
当CPU是64位地址针时,那么证明CPU读取最大的就是8字节地址(64位/8 byte == 8 字节) ------ 即指针大小固定为8字节(sizeof(int *) = 8)
指针是一种数据类型,不过是在基本数据类型上的派生。(整形指针、字符指针、浮点型指针、数组指针、函数指针等)
定义格式:
数据类型 * 标识符;
1)不赋初值------------------------->野指针(避免使用,段存储错误;可能会指向一个系统的地址,引起错误!)
int * ptr;
2)分配指定地址初始化
int num = 10;
int * ptr = #
3)指定地址为空--------------------->后续使用时在指向一个要操作地址
int * ptr = NULL;
相关操作(!!!!)
& --------------> 取地址操作符
这个操作符就是取空间的地址,常用来给指针赋值。可以认为 &对象 --> 对象的地址
* -------------->解地址(解释地址,就是说地址的空间里面是什么)
这个操作符在指针操作时就是解地址,将地址的空间拿来用。可以这样认为 * 指针 ---> 就是把指针指向的空间拿来使用
(3)结构体类型(struct)
数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
定义格式:
1)先声明结构体类型,在定义结构体变量
struct student
{
int id;
char name[20];
int score;
};
struct student stu;
2)在声明结构体类型的同时定义结构体变量
struct student
{
int id;
char name[20];
int score;
}stu;
同时,在声明定义一个结构体类型时,并不开辟空间,只有当初始化一个结构体时才开辟空间。例如:
struct student
{
int id;
char name[20];
int score;
};
不开辟空间,这是一个结构体类型,表示具体是什么结构成员组成的。
struct student stu;
为stu这个结构体开辟空间,表示开辟一个名为"stu"的空间
结构体大小------------------------->重点
1)找到结构体中最大的(基本数据类型)成员变量所占的字节数
2)结构体中成员变量的起始地址为该成员变量大小的整数倍(一般情况下我们认为第一个成员变量的起始地址为0)
3)结构体变量的总大小必须要是结构体中最大变量字节的整数倍(不足补齐)
结构体还有相关结合使用:
结构体指针
结构体数组
。。。。
(4)共用体类型(union)
其也是一个数据类型,不过其成员变量共用一个内存空间。
多个数据类型共同占用一个内存段--------------->节省空间
定义格式:
union 类型名 {成员变量;};
和结构体声明同理共用体类型不占用内存,不开辟空间
大小:
(1)先找到及基本数据类型最大的成员变量
(2)找到占用字节数最大的成员变量
(3)共用体的最终大小是基本数据类型最大的成员变量的整数倍
应用:
判断CPU大小端
(5)函数类型
函数的定义格式:
返回值类型 函数名 (形参,形参,…)
{
执行代码;
return 返回值;
}
1)无参无返回
void fun()
{
…
return ;
}
2)无参有返回
int fun()
{
…
return int;
}
3)有参无返回
void fun(int a,int b)
{
…
return ;
}
4)有参有返回
int fun(int a,char b)
{
…
return int;
}
5、总结
本篇是作者自己根据自己的容易出错的情况总结的,可能总结不到位,多多包涵。也希望各位大佬多多补充知识点。