从 C++ 基础到掌握 — 第 5 集
变量有哪些数据类型?
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
让我们了解一下变量的数据类型。 它大致可以分为四类。
基本数据类型。 这些是直接映射到内存的最基本类型。
1-A。特殊用途
void:没有大小。它不直接占用内存,是一种不完整类型。
std::nullptr_t:空指针文字 nullptr 的类型。
void DoSomething() {} //无返回值的函数
void* ptr = nullptr; //无类型指针
std::nullptr_t null_val = nullptr;
1-B。算术类型
1-B-1。整数 char、signed char、unsigned char:存储字符。还有用于 Unicode 的 wchar_t。 Short、int、long、long long:存储有符号整数。 unsigned Short、unsigned int、unsigned long、unsigned long long:存储无符号整数。因为它不存储负数,所以正数的存储空间是有符号数的两倍。 bool:存储 true 或 false。使用 1 个字节,而不是 1 位。
char c = 'A';
int count = -10;
unsigned int u_count = 20;
bool is_valid = true;
1-B-2浮点类型
遵循 IEEE 754 的类型, 基本上有float、double、long double, 还有 std::float16t、std::float32t、std::float64t、std::float128t 和 std::bfloat16_t。 (C++23 扩展)
float f_val = 3.14f;
double d_val = 3.1415926535;
2.复杂数据类型 这是一种通过组合基本类型或其他复杂类型来定义内存中的结构的类型。
指针(T):指向另一种类型T的内存地址。 成员指针(T::):指向类中特定成员变量或函数的内存偏移量的特殊指针。
参考: 左值引用 (T&):内存中具有名称和内容的对象(左值)的别名。 右值引用(T&&、C++11):绑定到临时对象,是移动语义和完美转发的核心类型。
数组(Array,T[N]/T[]):将相同类型的数据分配到连续的内存块中。 功能:签名本身由返回类型和参数列表组成,也是唯一类型。 (例如 int(double, char))
枚举: enum:没有指定范围的基本枚举(允许隐式整数转换)。
枚举类 (C++11):严格范围的枚举(强类型检查和范围保证)。 用户定义类型(Class/Struct/Union):通过控制内存填充和对齐规则来实现面向对象和数据结构的类型。
int value = 10;
int* ptr = &value; //指针
int& ref = value; //左值参考
int&& r_ref = 20; //右值参考
struct MyStruct { int x; };
int MyStruct::* member_ptr = &MyStruct::x; //成员指针
int arr[5] = {1, 2, 3, 4, 5}; //安排
int(*func_ptr)(int, int); //函数指针
enum class Color { Red, Green, Blue }; //严格枚举
3.系统架构特定的别名 这些是核心别名类型,其大小根据编译器和操作系统架构(32 位/64 位)动态确定。 (<cstddef> 标头)
std::sizet:sizeof 运算符的返回类型。它是一个无符号整数,可以表示系统中可以创建的最大对象的字节大小。 (容器索引和内存分配的标准单位) std::ptrdifft:一个有符号整数,表示两个指针相减时的距离。在计算内存地址之间的差异时使用。
#include <cstddef>
int arr[10];
std::size_t arr_size = sizeof(arr); //根据系统架构保证最大尺寸
std::ptrdiff_t diff = &arr[5] - &arr[0]; //计算指针之间的距离 (5)
4.简历预选赛 在 C++ 的类型系统中,如果将限定符添加到上述所有数据类型,则从编译器的角度来看,它们将被视为完全不同的类型并被重载。 (例如 int 和 const int 是不同的类型)
const:防止写入相应的内存区域并确保不变性。 易失性:强制阻止编译器的内存读/写优化。当控制硬件寄存器或与MMIO(内存映射I/O)通信时,它本质上是用来通知编译器寄存器值可以被外部源更改。
const int MAX_VALUE = 100; //只读,无法修改
//最大值=200; // 出现编译错误
volatile int hardware_register; //避免编译器优化
//外部硬件可以更改值,因此每次都直接从内存读取而不是缓存