数据结构中的指针14 Aug 2025 | 阅读 14 分钟 存储另一个变量地址的变量称为指针。普通变量存储值。然而,指针保存存储值的内存位置。指针允许我们直接更改和访问系统内存。指针提高了重复过程的性能。 ![]() C 和 C++ 等语言大量使用指针。然而,其他语言也可以有指针,尽管它们可能不尽相同。 指针示例在下图中,变量 a 在地址 2000 处存储值 10,变量 b 在地址 3000 处存储空值。但在下一个语句 (b=&a) 指向 a 的地址,这意味着变量 b 存储 a 的地址,即 2000。 ![]() 为什么我们需要数据结构中的指针?指针有助于减少算法将数据从一个位置复制到另一个位置所需的时间。因此,指针直接使用内存位置;对值的任何更改都将在所有位置反映出来。例如,
指针类型编程中有各种类型的指针,每种都有不同的用途。
1. 基本指针基本指针或主指针是存储另一个变量内存地址的变量。主指针是另一个变量的内存地址的变量。指针不实际存储数据本身,而是连接到存储数据的内存位置。因此,程序将有机会使用它来读取和写入位于给定内存地址的值。 C++ 中的实现 示例编译并运行输出 Value of variable: 12 Address of variable: 0x7fff4cbc3074 Value of pointer (Address it holds): 0x7fff4cbc3074 Value pointed to by pointer: 12 C 语言实现 示例编译并运行输出 Value of variable: 12 Address of variable: 0x7ffd68da3ec4 Value of pointer (holding Address): 0x7ffd68da3ec4 Value pointed to by pointer: 12 2. 空指针不指向合法内存位置的指针。它在许多编程语言中使用,其中指针不指向对象,或者可以说它未初始化。 在 Python 中实现 示例编译并运行输出 The variable is None. Java 实现 示例编译并运行输出 The variable has a null value. C++ 中的实现 示例编译并运行输出 The pointer is null. C 语言实现 示例编译并运行输出 The pointer is null. 3. 指针的指针(双指针)指向指针的指针也称为双指针。它是一种存储另一个指针内存地址的指针类型。如果需要,可以使用双指针间接引用数据。 C++ 中的实现 示例编译并运行输出 10 10 10 14 14 14 18 18 18 4. 智能指针智能指针充当指针,是封装指针的包装类。这些指针会自动管理它们指向的内存。它确保在不再需要时正确地释放内存。它在 C++ 中可用。 C++ 中的实现 示例编译并运行输出 uniPtr = 5 shPtr = 10, shPtr2 = 10 shPtr use_count = 2 5. void 指针void 指针是没有关联数据类型的指针。它可以存储任何数据类型的地址,并且可以转换为任何类型。 C++ 中的实现 示例编译并运行输出 Integer value: 2 Float value: 3.04 C 语言实现 示例编译并运行输出 Integer value: 2 Float value: 3.040000 6. 整数指针顾名思义,整数指针指向存储整数的内存地址。 C++ 中的实现 示例编译并运行输出 Value of v: 2 Value of p: 0x7ffe76867834 The value pointed by p: 2 C 语言实现 示例编译并运行输出 Value of v: 2 Value of p: 0x7ffe76867834 The value pointed by p: 2 7. 浮点数指针浮点数指针是指向存储浮点数的内存地址的指针。 C++ 中的实现 示例编译并运行输出 Value of v: 2.1 Value of p: 0x7ffefcae6e04 The value pointed by p: 2.1 C 语言实现 示例编译并运行输出 Value of v: 2.100000 Value of p: 0x7ffe396865b4 The value pointed by p: 2.100000 8. 数组指针数组指针是一种可以用于指向数组第一个元素的指针。除了存储相关数组的第一个元素的内存地址外,数组指针还与数组的元素类型相关联。 C++ 中的实现 示例编译并运行输出 11 21 31 41 51 C 语言实现 编译并运行输出 11 21 31 41 51 9. 函数指针函数指针是存储函数地址的指针。使用函数指针,可以调用函数指针指向的函数。这是因为函数指针具有函数地址。 C++ 中的实现 示例编译并运行输出 In the function foo. C 语言实现 示例编译并运行输出 In the function foo1. In the function foo2. 10. 结构指针(Struct 指针)结构指针是存储结构地址的指针。结构指针对于动态内存分配是必需的。函数参数以较小的开销传递给大型结构。 C++ 中的实现 示例编译并运行输出 Employee ID: 12 Employee Name: Tpointtech C 语言实现 示例编译并运行输出 Employee ID: 12 Employee Name: Tpointtech 11. 野指针这是一种不存储任何变量地址的指针。 如何避免野指针?
C 语言实现 输出 Runtime Error: run: line 1: 3 Segmentation fault (core dumped) ./a.out C++ 中的实现 输出 Runtime Error: run: line 1: 3 Segmentation fault (core dumped) LD_LIBRARY_PATH=/usr/local/gcc-9.2.0/lib64 ./a.out 12. 悬空指针悬空指针是指在内存被释放或超出作用域后仍然引用内存位置的指针。访问此类指针会导致未定义的行为——从垃圾值到程序崩溃。 悬空指针的原因
如何避免悬空指针?
C++ 中的实现 示例编译并运行输出 0 C 语言实现 示例编译并运行输出 Error executing code. 注意:Python、Java 和 JavaScript 等语言不直接支持指针,但它们使用对象和引用等类似概念。指针的应用指针由于各种原因至关重要
指针的优点
指针的缺点
重要提示
结论编程中的指针是有用的工具,它们存储变量的内存地址。不同类型的指针,如 Null、Void 等,具有独特的用途和属性。它们在内存管理中起着重要作用,使程序更灵活、更高效。另一方面,使用指针也有风险,因为不正确的使用可能导致崩溃和错误。 指针选择题1. 存储另一个变量地址的变量称为_____________。
答案:c) 解释:存储另一个变量地址的变量称为指针。 2. 在 C 和 C++ 等语言中,堆上的动态内存分配是通过 _____________ 完成的。
答案:c) 解释:在 C 和 C++ 等语言中,指针负责进行动态内存分配。 数组指针 3. _____________ 是一个没有关联数据类型的指针。
答案: d) 解释:void 指针是一个没有关联数据类型的指针。 4. _____________ 充当指针,是封装指针的包装类。
答案: a) 解释:智能指针充当指针,是封装指针的包装类。 5. _____________ 指针不指向合法的内存位置。
答案: b) 解释:不指向合法内存位置的指针。它在许多编程语言中使用,其中指针不指向对象,或者可以说它未初始化。 |
我们请求您订阅我们的新闻通讯以获取最新更新。