数据类型
基本类型
在数据类型的基础上,可使用前缀符号装饰
装饰符 | 意义 |
---|---|
unsigned | 无符号,即值范围均不小于0 |
signed | 有符号,即值范围为正负对称,其中最小负数的绝对值比最大正数大1,数据类型默认使用signed |
long | 扩大存储数据的内存,一般是原数据储存大小的2倍 |
short | 用于区别long,一般是保持原数据储存大小,数据类型默认使用short |
查询变量存储大小的方法:sizeof(var|type)
整数类型
类型 | 储存大小 | 值范围 |
---|---|---|
int | 4字节 | [ − 2 4 × 8 2 -\frac{2^{4\times8}}{2} −224×8, 2 4 × 8 2 − 1 \frac{2^{4\times 8}}{2}-1 224×8−1] |
unsigned int | 4字节 | [0, 2 4 × 8 − 1 2^{4\times 8}-1 24×8−1] |
long int | 8字节 | [ − 2 8 × 8 2 -\frac{2^{8\times8}}{2} −228×8, 2 8 × 8 2 − 1 \frac{2^{8\times 8}}{2}-1 228×8−1] |
unsigned long int | 8字节 | [0, 2 8 × 8 − 1 2^{8\times 8}-1 28×8−1] |
char | 1字节 | [ − 2 8 2 -\frac{2^{8}}{2} −228, 2 8 2 − 1 \frac{2^8}{2}-1 228−1] |
unsigned char | 1字节 | [0, 2 8 − 1 2^8-1 28−1] |
浮点类型
类型 | 储存大小 | 值范围 | 精度 |
---|---|---|---|
float | 4字节 | [ 1.2 × 1 0 − 38 1.2\times{10^{-38}} 1.2×10−38, 3.4 × 1 0 38 3.4\times{10^{38}} 3.4×1038] | 6位小数 |
double | 8字节 | [ 2.3 × 1 0 − 308 2.3\times{10^{-308}} 2.3×10−308, 1.7 × 1 0 308 1.7\times{10^{308}} 1.7×10308] | 15位小数 |
long double | 16字节 | [ 3.4 × 1 0 − 4932 3.4\times{10^{-4932}} 3.4×10−4932, 1.1 × 1 0 4932 1.1\times{10^{4932}} 1.1×104932] | 19位小数 |
枚举类型
用途:存储一系列的离散值
定义格式:enum 枚举名 {枚举元素1,枚举元素2,...,枚举元素n};
枚举变量的定义格式
enum 枚举名 {枚举元素1,枚举元素2,...,枚举元素n} 枚举变量名;
enum {枚举元素1,枚举元素2,...,枚举元素n} 枚举变量名;
-
enum 枚举名 {枚举元素1,枚举元素2,...,枚举元素n}; enum 枚举名 枚举变量名;
注意:
- 枚举变量属于编译器直接编译到命令里的,不是保存在数据区的内存中,不能通过
&
取枚举变量的地址。 - 枚举变量元素属于全局变量,不能再定义和其重名的变量。
- 枚举元素属于常量,不能对它们进行赋值
void类型
void类型指定没有可用的值,在C中主要有三种情况。
类型 | 意义 |
---|---|
函数返回为空 | 当函数没有返回值时,这种类型的函数就是空类型。 |
函数参数为空 | 当函数不接受任何参数时,这种函数就是可接受一个空类型。 |
指针指向为空 | 在动态分配内存时,仅返回所在内存的地址,内存存放数据的类型暂时不知,这是就可以将该指针指向空类型,后续可以转换为任意类型。 |
派生类型
指针类型
在计算机中,任何数据都存储在内存中,每个存储位置都有一个唯一的编号,即地址。在C语言中,我们可以通过&
运算符来获取数据存储在内存中的地址。将所获取的地址存储在一个新的变量中,而这个新的变量,我们称之为指针。
指针变量的定义格式:type *指针变量名=NULL;
获取指针所指向变量的值的格式:*指针变量名
数组类型
程序所使用的数据都是存储在内存中,每种数据的在内存中的存储方式也是不相同的。其中,将内存中的一个固定大小区域, 按顺序存储一系列数据类型相同的数据,这个内存块的数据整体,称之为数组,数组名则是指以该内存块的首地址为值的变量,即是指针类型。
数组变量的定义格式:type 数组名[数组大小];
初始化数组:type 数组名[数组大小n] = {元素0, 元素1,...,数组n-1};
注意: 如果未初始化数组,数组的元素将由系统随机分配;如果只是初始化部分数组元素,其余元素将由系统随机分配;数组的索引从0开始,到n-1结束。
访问数组:
- 基于数组的方法:
数组名[索引]
- 基于指针的方法:
*(数组名+索引)
字符串类型
指定内存中的一个固定大小区域, 按顺序存储一系列字符类型的数据,这个内存块的数据整体,称之为字符串类型,其本质是数组。
定义格式:char 字符串名称[字符串长度+1];
字符串变量初始化:
char 字符串名称[字符串长度+1]={元素0,元素1,...,元素n-1,'\0'};
char 字符串名称[]="xxxxxxx";
在c语言中,’x‘表示一个字符,“x”表示一个字符串。
结构体类型
在内存中划定一个固定大小的区域,指定内存中存储数据的类型和顺序,这个内存块的数据整体,称之为结构体。结构体的长度并不是简单地将结构体地所有成员相加,最终的长度必须是所有成员的公倍数具体可参考
定义格式:
struct 结构体名称
{
type var_name;
type var_name;
.
.
.
};
结构体变量的定义格式:
struct 结构体名称
{
type var_name;
type var_name;
.
.
.
};
struct 结构体名称 结构体变量名;
struct 结构体名称
{
type var_name;
type var_name;
.
.
.
} 结构体变量名;
struct
{
type var_name;
type var_name;
.
.
.
} 结构体变量名;
结构体变量初始化:
struct 结构体名称{
type_1 var_1;
type_2 var_2;
};
struct 结构体名称 结构体变量名={value_1, value_2};
struct 结构体名称{
type_1 var_1;
type_2 var_2;
};
struct 结构体名称 结构体变量名;
结构体.var_1 = value_1;
结构体.var_2 = value_2;
访问结构体变量成员,使用.
struct 结构体名称{
type_1 var_1;
type_2 var_2;
} 结构体变量名={value_1, value_2};
if (结构体.var_1 == 结构体.var_2)
printf("True");
如果使用指针指向结构体,例如struct 结构体名称 *指针名称
,此时要访问结构体元素,需要使用->
运算符,例如指针名称->var_1
共用体类型
在相同的内存位置上,根据需求,可以存储不同的数据类型,但是同一时间,仅能存储一种数据类型,这种数据类型成为共用体类型。共用体类型和结构体类型很容易混淆,他们的主要区别在于共用体的所有成员共用一个地址,同一时间内只能出现一个成员,共用体的长度等于所有成员中的最大长度具体可参考
定义格式:
union 共用体名称
{
type var_name;
type var_name;
.
.
.
};
共用体变量的定义格式:
union 共用体名称
{
type var_name;
type var_name;
.
.
.
};
union 共用体名称 共用体变量名;
union 共用体名称
{
type var_name;
type var_name;
.
.
.
} 共用体变量名;
union
{
type var_name;
type var_name;
.
.
.
} 共用体变量名;
访问共用体变量成员,使用.
union 共用体名称{
type_1 var_1;
type_2 var_2;
} 共用体变量名;
printf("%s", 共用体变量名.var_1);
函数类型
除了main函数外,我们可以根据自己的需求,自定义函数,即函数类型;
定义格式:
return_type 函数名(type_1 var_1, type_1 var_2)
{
statments;
return var;
}
函数变量的定义格式:type 函数名(type_1 var_1, type_1 var_2);
致谢
本文主要参考菜鸟教程,在此表示感谢!