- C 编程教程
- C - 首页
- C 基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C 中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C 中的操作符
- C - 操作符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C 中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C 中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C 中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C 中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C 中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 变长数组
- C 中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指向指针的指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - 空类型指针
- C - 野指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C 中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C 结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C 中的文件处理
- C - 输入 & 输出
- C - 文件 I/O (文件处理)
- C 预处理器
- C - 预处理器
- C - 指令
- C - 预处理器操作符
- C - 宏
- C - 头文件
- C 中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C 编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C - 数据类型
C 语言中的数据类型指的是一个广泛的系统,用于声明不同类型的变量或函数。变量的类型决定了它在存储器中占用多少空间以及如何解释存储的位模式。在本章中,我们将学习C 语言中的数据类型。一个相关的概念是“变量”,它指的是处理器内存中可寻址的位置。通过不同的输入设备捕获的数据存储在计算机内存中。可以为存储位置分配一个符号名称,称为变量名。
C 是一种静态类型语言。在实际使用变量之前,必须显式声明变量的名称及其要存储的数据类型。
C 也是一种强类型语言,这意味着不允许自动或隐式地将一种数据类型转换为另一种数据类型。
C 语言中的类型可以分类如下:
序号 | 类型 & 描述 |
---|---|
1 | 基本类型 它们是算术类型,进一步分为:(a) 整数类型和 (b) 浮点类型。 |
2 | 枚举类型 它们也是算术类型,用于定义只能在整个程序中分配某些离散整数值的变量。 |
3 | void 类型 类型说明符void表示没有值可用。 |
4 | 派生类型 它们包括 (a) 指针类型,(b) 数组类型,(c) 结构体类型,(d) 联合体类型和 (e) 函数类型。 |
数组类型和结构体类型统称为聚合类型。函数的类型指定函数返回值的类型。我们将在下一节中看到基本类型,而其他类型将在后续章节中介绍。
C 语言中的整数数据类型
下表提供了标准整数类型的详细信息,包括其存储大小和值范围:
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255 |
unsigned char | 1 字节 | 0 到 255 |
signed char | 1 字节 | -128 到 127 |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字节 | -32,768 到 32,767 |
unsigned short | 2 字节 | 0 到 65,535 |
long | 8 字节 | -9223372036854775808 到 9223372036854775807 |
unsigned long | 8 字节 | 0 到 18446744073709551615 |
要获取特定平台上某个类型或变量的确切大小,可以使用sizeof运算符。表达式sizeof(type)以字节为单位生成对象或类型的存储大小。
整数数据类型的示例
下面是一个示例,使用 limits.h 头文件中定义的不同常量来获取机器上各种类型的尺寸:
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> int main(int argc, char** argv) { printf("CHAR_BIT : %d\n", CHAR_BIT); printf("CHAR_MAX : %d\n", CHAR_MAX); printf("CHAR_MIN : %d\n", CHAR_MIN); printf("INT_MAX : %d\n", INT_MAX); printf("INT_MIN : %d\n", INT_MIN); printf("LONG_MAX : %ld\n", (long) LONG_MAX); printf("LONG_MIN : %ld\n", (long) LONG_MIN); printf("SCHAR_MAX : %d\n", SCHAR_MAX); printf("SCHAR_MIN : %d\n", SCHAR_MIN); printf("SHRT_MAX : %d\n", SHRT_MAX); printf("SHRT_MIN : %d\n", SHRT_MIN); printf("UCHAR_MAX : %d\n", UCHAR_MAX); printf("UINT_MAX : %u\n", (unsigned int) UINT_MAX); printf("ULONG_MAX : %lu\n", (unsigned long) ULONG_MAX); printf("USHRT_MAX : %d\n", (unsigned short) USHRT_MAX); return 0; }
输出
编译并执行上述程序时,它在 Linux 上会产生以下结果:
CHAR_BIT : 8 CHAR_MAX : 127 CHAR_MIN : -128 INT_MAX : 2147483647 INT_MIN : -2147483648 LONG_MAX : 9223372036854775807 LONG_MIN : -9223372036854775808 SCHAR_MAX : 127 SCHAR_MIN : -128 SHRT_MAX : 32767 SHRT_MIN : -32768 UCHAR_MAX : 255 UINT_MAX : 4294967295 ULONG_MAX : 18446744073709551615 USHRT_MAX : 65535
C 语言中的浮点数据类型
下表提供了标准浮点类型的详细信息,包括存储大小、值范围及其精度:
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位小数 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位小数 |
long double | 10 字节 | 3.4E-4932 到 1.1E+4932 | 19 位小数 |
"float.h"头文件定义了宏,允许您在程序中使用这些值以及关于实数二进制表示的其他详细信息。
浮点数据类型的示例
以下示例打印 float 类型的存储空间和范围值:
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> int main(int argc, char** argv) { printf("Storage size for float : %zu \n", sizeof(float)); printf("FLT_MAX : %g\n", (float) FLT_MAX); printf("FLT_MIN : %g\n", (float) FLT_MIN); printf("-FLT_MAX : %g\n", (float) -FLT_MAX); printf("-FLT_MIN : %g\n", (float) -FLT_MIN); printf("DBL_MAX : %g\n", (double) DBL_MAX); printf("DBL_MIN : %g\n", (double) DBL_MIN); printf("-DBL_MAX : %g\n", (double) -DBL_MAX); printf("Precision value: %d\n", FLT_DIG ); return 0; }
输出
编译并执行上述程序时,它在 Linux 上会产生以下结果:
Storage size for float : 4 FLT_MAX : 3.40282e+38 FLT_MIN : 1.17549e-38 -FLT_MAX : -3.40282e+38 -FLT_MIN : -1.17549e-38 DBL_MAX : 1.79769e+308 DBL_MIN : 2.22507e-308 -DBL_MAX : -1.79769e+308 Precision value: 6
注意:"sizeof" 返回 "size_t"。 "size_t" 的无符号整数类型可能会因平台而异。而且,它可能并非在所有地方都是 long unsigned int。在这种情况下,我们使用 "%zu" 作为格式字符串而不是 "%d"。
早期版本的 C 语言没有布尔数据类型。ANSI C 的 C99 标准化引入了 _bool 类型,它将零值视为 false,非零值视为 true。
C 语言中的用户定义数据类型
有两种用户定义的数据类型struct和union,可以使用其他基本数据类型的组合来定义。
结构体数据类型
C 语言的独特特性之一是将不同数据类型的变量存储在一个变量中。提供了struct和union关键字来派生用户定义的数据类型。例如,
struct student { char name[20]; int marks, age; };
联合体数据类型
联合体是结构体的一种特殊情况,其中联合体变量的大小不是各个元素大小的总和(如结构体),而是对应于各个元素中最大的大小。因此,一次只能使用其中一个元素。请看以下示例
union ab { int a; float b; };
我们将在后面的章节中学习更多关于结构体和联合体类型的知识。
C 语言中的 void 数据类型
void 类型指定没有值可用。它用于三种情况:
序号 | 类型 & 描述 |
---|---|
1 |
函数返回 void C 语言中有各种函数不返回值,或者可以说它们返回void。不返回值的函数的返回类型为void。例如,void exit (int status); |
2 |
函数参数为 void C 语言中有各种函数不接受任何参数。不带参数的函数可以接受 void。例如,int rand(void); |
3 |
指向 void 的指针 void *类型的指针表示对象的地址,但不表示其类型。例如,内存分配函数 void *malloc( size_t size );返回一个指向 void 的指针,该指针可以转换为任何数据类型。 |
C 语言中的数组数据类型
数组是存储在连续内存位置中的多个相同数据类型值的集合。数组的大小在方括号 [] 中指定。例如,
int marks[5];
可以在声明时初始化数组。要分配的值放在括号中。
int marks[ ]={50,56,76,67,43};
C 还支持多维数组。要了解更多关于数组的信息,请参阅关于C 语言中的数组的章节。
C 语言中的指针数据类型
指针是一种特殊的变量,它存储内存中另一个变量/对象的地址或引用。指针变量的名称以星号 (*) 为前缀。指针变量的类型和要指向的变量/对象必须相同。
int x; int *y; y = &x;
这里,"y" 是一个指针变量,它存储 "int" 类型变量 "x" 的地址。
指针用于许多不同的目的。文本字符串操作和动态内存分配是一些必须使用指针的过程。在本教程的后面,您可以找到关于C 语言中的指针的详细章节。