C 语言中有四种数据类型——整型、浮点型、指针和聚合类型。所有其他的类型都是从这四种类型的某种组合派生而来。
整型
整型包括字符、短整型、整型和长整型,使用有符号 signed
和无符号 unsigned
两个关键字标记整型,其中 signed
为C90标准添加的关键字。
规定整型值相互之间大小的规则为 长整型至少应该和整型一样大,而整型至少应该和短整型一样长。
C 语言针对不同情况,提供了不同的整数类型。特别是,C 语言中的整数类型可表示不同的取值范围和正负值。一般情况使用 int 类型即可。但是为了满足特定任务和机器的要求,还可以选择其他类型。
ANSI C 标准给定了各种整型值的最小范围的规范,如下所示。
类型 | 字节 | 最小范围 |
---|---|---|
char | 1 byte | 0~127 |
singed char | 1 byte | -127~127 |
unsigned char | 1 byte | 0~255 |
short int | 2 byte | -32767~32767 |
unsigned short int | 2 byte | 0~65535 |
int | 2/4 byte | -32767~32767 |
unsigned int | 2/4 byte | 0~65535 |
long int | 4 byte | -2147483647~2147483647 |
unsigned long int | 4 byte | 0~4294967295 |
上表中字节大小不确定的类型由编译器决定。在编写程序时,可以使用 sizeof
运算符,获取特定平台下,某个类型或变量的大小,如下所示。
unsigned long int a = 10;
printf("%llun", sizeof(a)); // 4
limits.h
头文件还提供了不同整数类型的特点,还提供了不同整数类型在 signed
或 unsigned
中的取值范围。
signed | unsigned | ||
---|---|---|---|
类型 | 最小值 | 最大值 | 最大值 |
字符 | SCHAR_MIN | SCHAR_MAX | UCHAR_MAX |
短整型 | SHRT_MIN | SHRT_MAX | USHRT_MAX |
整型 | INT_MIN | INT_MAX | UINT_MAX |
长整型 | LONG_MIN | LONG_MAX | ULONG_MAX |
C99标准中添加了
unsigned long long int
或unsigned long long
。
char
类型容纳的是字符型值,但本质上是小整型值。根据C90标准定义,char
可以使用 signed
或 unsigned
,而缺省的 char
是 signed char
或 unsigned char
,取决于编译器。所以,char
型变量的值位于 signed char
和 unsigned char
的交集中,程序才是可移植的。例如,ASCII
字符集中的字符都是位于这个范围之内的。
浮点型
浮点型提供了 float
、double
和 long double
类型用来存储 3.14159
等带小数的浮点数。ANSI C 标准仅规定 long double
至少和 double
一样长,而 double
至少和 float
一样长。标准同时规定了一个最小范围,所有浮点类型表示的值在 到 之间。下表给出了 ANSI C 标准的各种浮点型值的最小范围的规范。
类型 | 字节 | 最小范围 |
---|---|---|
float | 4 byte | 1.2E-38~3.4E+38 |
double | 8 byte | 2.3E-308~1.7E+308 |
long double | 16 byte | 3.4E-4932~1.1E+4932 |
float.h
头文件提供了 float
、double
和 long double
的取值范围的名字。
类型 | 最小值 | 最大值 |
---|---|---|
float | FLT_MIN | FLT_MAX |
double | DBL_MIN | DBL_MAX |
long double | LDBL_MIN | LDBL_MAX |
浮点数字面值总是写成十进制的形式,它必须有一个小数点或一个指数,也可以两者都有。这里有一些例子:
3.14159 1E10 25. .5 6.023e23
浮点数字面量在缺省的情况下都是 double
类型,当显式在数字后面跟 L
或 l
表示是 long double
类型值,跟 F
或 f
表示是 float
类型值。
指针
变量的值存储于内存中,每个内存位置都由地址唯一确定并引用。指针提供了一种以符号形式使用地址的方法。使用指针可以更有效率地实现诸如 tree
和 list
等高级数据结构,但不加限制也是错误的根源。
unsigned long int month[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
unsigned long int *p;
p = month; // 把数组地址赋给指针
for (int index = 0; index < 12; index++) {
printf("%lu Monthn", *(p + index));
}
可以通过指针访问数组的地址,在指针前面加上 *
运算符就可以得到该指针所指向对象的值。
聚合类型
聚类数据类型 aggregate data type
能够同时存储超过一个的单独数据。
数组
数组 array
是由数据类型相同的一系列元素组成的顺序集合,每个元素通过下标引用或指针间接访问。声明数组时,编译器根据元素类型与数量创建,如下所示。
unsigned long int month[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // 内含 12 个 unsigned long int 类型元素的数组
与普通变量类似,使用数组元素前,必须先给他们赋初值。编译器使用的值是内存相应位置上的现有值。
结构
结构 structure variable
是以不同数据类型为成员,组合而成的复杂复杂结构。每个结构成员有自己的名字,并通过名字访问其结构成员。
typedef struct {
int data; //数据域
struct BiTNode * lchild, *rchild; //左右孩子指针
} BiTNode;
联合
联合 union
是一种特殊的数据类型,与结构类似,但联合中,不同数据类型的成员引用的是内存中的相同位置。因此,使用联合以存储既无规律、事先也不知道顺序的混合类型。
typedef union {
int math;
double chinese;
} Score;
Score s;
s.math = 50;
s.chinese = 92.5;
假设在 32 位机器上编译,联合所占大小为 8 字节,即 double
类型的大小。执行上述代码后,s.math
未定义,s.chinese
的值为 92.5
。
枚举
可以用枚举类型 enumerated type
声明符号名称来表示整型常量。使用 enum 关键字,可以创建一个新类型并指定它具有的值(实际上,enum常量是int类型,因此,只要能使用int类型的地方就可以使用枚举类型)。枚举类型的目的是提高程序的可读性。它的语法与结构的语法相同。例如,可以这样声明
枚举 enumerated
类型用来声明符号名称来表示整型常量。枚举类型使用 enum
关键字创建并指定具有的值。
enum account_type {
USERNAME,
EMAIL,
PHONE,
SOCIAL
};
上面的枚举类型中,定义符号名号名称实际上还是整型值类型,如 USERNAME
是 0
,EMAIL
是 1
,依次类推。也可以为这些符号名指定特定整型值,如下所示。
enum account_type {
USERNAME=8,
EMAIL=16,
PHONE=32,
SOCIAL=64
};
因此,枚举类型的目的是提高程序的可读性,但不能把枚举变量同整数无差别地混合使用,会削弱它们值的含义。
void
C90标准增加了 void
类型,用于指定没有可用的值。通常用于以下三种情况:
-
对函数返回的限定。函数不需要返回值时,可以返回 void
类型的返回值,如void run(int a)
。 -
对函数参数的限定。函数参数不接受任何参数,可指明参数 void
,如int rand(void)
。 -
void
指针。void
指针指向对象地址,而不是类型;任何指针都可以赋值给void
指针。
typedef
typedef
可以为各种数据类型自定义名称。与 #define
类似,但也有不同之处:
-
typedef
创建的符号名受限于类型,不能用于值。 -
typedef
由编译器解释,不是预处理器。 -
在其受限范围内, typedef
比#define
更灵活。
与普通声明基本相同,把 typedef
放在声明前面即可,如下所示。
typedef unsigned long int INTEGER;
之后可以使用新名字 INTEGER
来定义 unsigned long int
类型的变量:
INTEGER a = 10;
该定义的作用域取决于 typedef
定义所在的位置。在函数中定义,就具有局部作用域,在函数外面,就具有文件作用域。

原文始发于微信公众号(海人为记):一文讲解C语言数据类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27551.html