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 - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 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 - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 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 语言中的整数数据类型

下表列出了标准整数类型及其存储大小和取值范围的详细信息 -

类型 存储大小 取值范围
字符型 1 字节 -128 至 127 或 0 至 255
无符号字符型 1 字节 0 至 255
有符号字符型 1 字节 -128 至 127
整数 2 或 4 个字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
无符号整数 2 或 4 个字节 0 到 65,535 或 0 到 4,294,967,295
短整型 2 个字节 -32,768 到 32,767
无符号短整型 2字节 0 到 65,535
长整型 8 字节 -9223372036854775808 到 9223372036854775807
无符号长整型 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
", CHAR_BIT);
   printf("CHAR_MAX    :   %d
", CHAR_MAX);
   printf("CHAR_MIN    :   %d
", CHAR_MIN);
   printf("INT_MAX     :   %d
", INT_MAX);
   printf("INT_MIN     :   %d
", INT_MIN);
   printf("LONG_MAX    :   %ld
", (long) LONG_MAX);
   printf("LONG_MIN    :   %ld
", (long) LONG_MIN);
   printf("SCHAR_MAX   :   %d
", SCHAR_MAX);
   printf("SCHAR_MIN   :   %d
", SCHAR_MIN);
   printf("SHRT_MAX    :   %d
", SHRT_MAX);
   printf("SHRT_MIN    :   %d
", SHRT_MIN);
   printf("UCHAR_MAX   :   %d
", UCHAR_MAX);
   printf("UINT_MAX    :   %u
", (unsigned int) UINT_MAX);
   printf("ULONG_MAX   :   %lu
", (unsigned long) ULONG_MAX);
   printf("USHRT_MAX   :   %d
", (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 语言中的浮点数据类型

下表提供了标准浮点类型的详细信息,包括存储大小、值范围及其精度 -

类型 存储大小 取值范围 精度
浮点型 4 字节 1.2E-38 到 3.4E+38 6 位小数
双精度型 8 字节 2.3E-308 到 1.7E+308 15 位小数
长整型双精度型 10 字节 3.4E-4932 到 1.1E+4932 19 位小数

头文件"float.h"定义了一些宏,允许您在程序中使用这些值以及有关实数二进制表示的其他详细信息。

浮点数据类型示例

以下示例打印浮点类型占用的存储空间及其范围值 -

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("Storage size for float : %zu 
", sizeof(float));
   printf("FLT_MAX     :   %g
", (float) FLT_MAX);
   printf("FLT_MIN     :   %g
", (float) FLT_MIN);
   printf("-FLT_MAX    :   %g
", (float) -FLT_MAX);
   printf("-FLT_MIN    :   %g
", (float) -FLT_MIN);
   printf("DBL_MAX     :   %g
", (double) DBL_MAX);
   printf("DBL_MIN     :   %g
", (double) DBL_MIN);
   printf("-DBL_MAX     :  %g
", (double) -DBL_MAX);
   printf("Precision value: %d
", 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"的无符号整数类型可能因平台而异。并且,它可能并非在所有情况下都是长整型无符号整数。在这种情况下,我们使用"%zu"作为格式字符串,而不是"%d"。

早期版本的 C 语言没有布尔数据类型。 ANSI C 的 C99 标准化引入了 _bool 类型,该类型将零值视为假,将非零值视为真。

C 语言中的用户定义数据类型

有两种用户定义数据类型:structunion,用户可以结合其他基本数据类型来定义它们。

结构体数据类型

C 语言独有的特性之一就是将不同类型的值存储在一个变量中。关键字 structunion 用于派生用户定义数据类型。例如,

struct student   {   
   char name[20];   
   int marks, age;   
};

联合数据类型

联合是结构体的一种特殊情况,联合变量的大小不像结构体那样是各个元素大小的总和,而是对应于各个元素中最大的一个。因此,一次只能使用一个元素。请看以下示例:

union ab {
    int a;
    float b;
};

我们将在后面的章节中了解更多关于结构体和联合类型的知识。

C 语言中的 void 数据类型

void 类型指定没有可用的值。它在三种情况下使用 -

Sr.No 类型 &说明
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 语言中的指针 的详细章节。