对比 C++ 与 Python,探讨编程语言中的指针及引用
0 引言
指针(Pointer)是 C、C++ 以及 Java、Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念。
指针对于任何一个编程语言而言都是必须且重要的,虽然 Python 对指针这一概念进行了刻意的模糊与限制,但指针对于 Python 而言依然是一个必须进行深入讨论的话题。
本文基于 C++ 与 Python,讨论了 Python 中与指针及引用相关的一些行为。
1 什么是指针?为什么需要指针?
指针有两重含义:
(1)指代某种数据类型的指针类型,如整形指针类型、指针指针类型
(2)指代一类存放有内存地址的变量,即指针变量
指针的这两重含义是紧密联系的:作为一种变量,通过指针可以获取某个内存地址,从而为访问此地址上的值做好了准备;作为一种类型,其决定了内存地址的正确偏移长度,其应等于当前类型的单位内存大小。
如果一个指针缺少指针类型,即 void *,则显然,其虽然保存了内存地址,但这仅仅是一个起点地址,指针会因为无法获知从起点向后进行的偏移量,从而拒绝解指针操作;而如果一个指针缺少地址,即 nullptr,则其根本无法读取特定位置的内存。
指针存在的意义主要有以下几点:
- 承载通过 malloc、new、allocator 等获取的动态内存
- 使得 pass-by-pointer 成为可能
pass-by-pointer 的好处包括但不限于:
- 避免对实参无意义的值拷贝,大幅提高效率
- 使得对某个变量的修改能力不局限于变量自身的作用域
- 使得 swap、移动构造函数、移动赋值运算等操作可以仅针对数据结构内部的指针进行操作,从而避免了对临时对象、移后源等对象的整体内存操作
由此可见,与指针相关的各操作对于编程而言都是必须的或十分重要的。
2 C++中的引用
在 C++ 中,引用具有与指针相似的性质,但更加隐形与严格。C++ 的引用分为以下两种:
2.1 左值引用
左值引用于其初始化阶段绑定到左值,且不存在重新绑定。
左值引用具有与被绑定左值几乎一样的性质,其唯一的区别在于 decltype 声明:
int numA = 0, &lrefA = numA; // Binding an lvalue
cout