在 C 和 C++ 中,数据类型是用于定义变量的内存布局和操作方式的基本单元。它们决定了变量存储的内存大小、表示范围及可执行的操作。C/C++ 提供了多种数据类型,包括基本数据类型、枚举类型、派生类型、用户定义类型等。
1. 基本数据类型(Primitive Data Types)
这些是语言内建的基本数据类型,直接用于存储最简单的数值数据。
整型(int
):用于表示整数类型的数值。整型的大小通常是 4 个字节,取决于系统,但在大多数现代系统中是 32 位,表示范围为 -2,147,483,648
到 2,147,483,647
。
- short
(短整型):通常为 2 字节,表示范围较小。
- long
(长整型):通常为 4 个或 8 个字节,表示范围较大。
- long long
(更长整型):通常为 8 个字节,用于表示更大的范围。
带符号(signed
)和无符号(unsigned
):signed
是默认的,表示范围包括正负数;unsigned
则只能表示非负数(0 及以上)。
浮点型(float
, double
):用于表示带小数的数值。
- float
:单精度浮点数,占 4 字节,约 7 位有效数字。
- double
:双精度浮点数,占 8 字节,约 15 位有效数字。
- long double
:扩展精度浮点数,通常占 10 到 16 字节,精度更高,但实现因编译器而异。
字符型(char
):用于存储单个字符,占 1 个字节(通常为 8 位),可以表示 ASCII 编码中的字符。
- signed char
和 unsigned char
:分别表示带符号和无符号字符。
布尔型(bool
):仅用于 C++,表示布尔值 true
和 false
,占 1 字节。
2. 枚举类型(Enumerated Type)
enum
用于定义一组具名的整数常量。每个枚举值默认从 0 开始依次递增。示例如下:
enum Color { RED, GREEN, BLUE };
Color c = RED;
在这里,RED
的值是 0,GREEN
是 1,BLUE
是 2。
3. 派生数据类型(Derived Data Types)
这些类型是通过基本数据类型派生出来的,用于更复杂的数据结构。
指针(Pointer):用于存储变量的内存地址。C/C++ 中的指针是一种强大的工具,可以用来操作内存。
int a = 10;
int *ptr = &a; // ptr 存储 a 的地址
数组(Array):用于存储相同类型的数据的集合。数组在内存中是连续存储的,可以通过索引访问每个元素。
int arr[5] = {1, 2, 3, 4, 5};
结构体(Structure):一种用户定义的类型,用于将不同数据类型的变量组合在一起。特别适用于描述复杂的数据结构。
struct Person {
char name[50];
int age;
};
联合体(Union):与结构体类似,但所有成员共享相同的内存地址,这意味着一个时刻只能存储一个成员。
union Data {
int i;
float f;
char str[20];
};
函数:函数本身也是一种数据类型,在 C/C++ 中可以用来声明指向函数的指针。
4. 用户定义的类型(User-defined Types)
C++ 允许通过 typedef
和 using
定义新的类型名称,以及类和结构体来构造自定义数据类型。
typedef
和 using
:用于给现有类型起别名。
typedef int Integer;
using Integer = int;
Integer a = 5;
类(Class):C++ 的核心特性,用于定义对象类型,包含成员变量和成员函数。
class Car {
public:
int speed;
void drive() { /*...*/ }
};
5. 空类型(Void Type)
void
用于表示空类型,在函数返回类型中常见,表示不返回值。`void` 指针是通用指针,表示可以指向任何数据类型,但不能直接解引用,需要转换为具体的类型指针。
6. C++11/14 新增类型
在 C++11 和 C++14 中,新增了一些类型增强类型安全性和效率,例如:
nullptr
:表示空指针,取代传统的 NULL
宏,提高类型安全性。
auto
:自动类型推导,让编译器推导变量类型。
auto x = 10; // x 会被推导为 int
decltype
:用于获取表达式的类型,通常用于模板和泛型编程。
7. C++中的其他数据类型(如标准库类型)
C++ 标准库提供了丰富的容器和数据结构类型,如 std::string
(字符串类)、`std::vector`(动态数组)、`std::map`(键值对集合)等,用于更高级的数据操作。
这些数据类型构成了 C/C++ 编程的基础,不同的类型适用于不同的场景,可以根据需求选择合适的数据类型来组织和存储数据。