暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文讲解C语言数据类型

海人为记 2021-10-07
480

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

整型

整型包括字符、短整型、整型和长整型,使用有符号 signed
和无符号 unsigned
两个关键字标记整型,其中 signed
为C90标准添加的关键字。

规定整型值相互之间大小的规则为 长整型至少应该和整型一样大,而整型至少应该和短整型一样长

C 语言针对不同情况,提供了不同的整数类型。特别是,C 语言中的整数类型可表示不同的取值范围和正负值。一般情况使用 int 类型即可。但是为了满足特定任务和机器的要求,还可以选择其他类型。

ANSI C 标准给定了各种整型值的最小范围的规范,如下所示。

类型字节最小范围
char1 byte0~127
singed char1 byte-127~127
unsigned char1 byte0~255
short int2 byte-32767~32767
unsigned short int2 byte0~65535
int2/4 byte-32767~32767
unsigned int2/4 byte0~65535
long int4 byte-2147483647~2147483647
unsigned long int4 byte0~4294967295

上表中字节大小不确定的类型由编译器决定。在编写程序时,可以使用 sizeof
运算符,获取特定平台下,某个类型或变量的大小,如下所示。

unsigned long int a = 10;
printf("%llu\n"sizeof(a));    // 4

limits.h
头文件还提供了不同整数类型的特点,还提供了不同整数类型在 signed
unsigned
中的取值范围。


signedunsigned
类型最小值最大值最大值
字符SCHAR_MINSCHAR_MAXUCHAR_MAX
短整型SHRT_MINSHRT_MAXUSHRT_MAX
整型INT_MININT_MAXUINT_MAX
长整型LONG_MINLONG_MAXULONG_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 标准的各种浮点型值的最小范围的规范。

类型字节最小范围
float4 byte1.2E-38~3.4E+38
double8 byte2.3E-308~1.7E+308
long double16 byte3.4E-4932~1.1E+4932

float.h
头文件提供了 float
double
long double
的取值范围的名字。

类型最小值最大值
floatFLT_MINFLT_MAX
doubleDBL_MINDBL_MAX
long doubleLDBL_MINLDBL_MAX

浮点数字面值总是写成十进制的形式,它必须有一个小数点或一个指数,也可以两者都有。这里有一些例子:

3.14159    1E10    25.    .5    6.023e23

浮点数字面量在缺省的情况下都是 double
类型,当显式在数字后面跟 L
l
表示是 long double
类型值,跟 F
f
表示是 float
类型值。

指针

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

unsigned long int month[12] = {123456789101112};
unsigned long int *p;
p = month;  // 把数组地址赋给指针
for (int index = 0; index < 12; index++) {
    printf("%lu Month\n", *(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
};

上面的枚举类型中,定义符号名号名称实际上还是整型值类型,如 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
定义所在的位置。在函数中定义,就具有局部作用域,在函数外面,就具有文件作用域。





文章转载自海人为记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论