一文讲解C语言数据类型

C 语言中有四种数据类型——整型、浮点型、指针和聚合类型。所有其他的类型都是从这四种类型的某种组合派生而来。

一文讲解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 头文件还提供了不同整数类型的特点,还提供了不同整数类型在 signedunsigned 中的取值范围。


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 intunsigned long long

char 类型容纳的是字符型值,但本质上是小整型值。根据C90标准定义,char 可以使用 signedunsigned,而缺省的 charsigned charunsigned char,取决于编译器。所以,char 型变量的值位于 signed charunsigned char 的交集中,程序才是可移植的。例如,ASCII 字符集中的字符都是位于这个范围之内的。

浮点型

浮点型提供了 floatdoublelong 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 头文件提供了 floatdoublelong 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 类型,当显式在数字后面跟 Ll 表示是 long double 类型值,跟 Ff 表示是 float 类型值。

指针

变量的值存储于内存中,每个内存位置都由地址唯一确定并引用。指针提供了一种以符号形式使用地址的方法。使用指针可以更有效率地实现诸如 treelist 等高级数据结构,但不加限制也是错误的根源。

unsigned long int month[12] = {123456789101112};
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] = {123456789101112};    // 内含 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
};

上面的枚举类型中,定义符号名号名称实际上还是整型值类型,如 USERNAME0EMAIL1,依次类推。也可以为这些符号名指定特定整型值,如下所示。

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语言数据类型


原文始发于微信公众号(海人为记):一文讲解C语言数据类型

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27551.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!