C++中int *a; int &a; int & *a; int * &a

本文深入解析了C++中指针与引用的区别及混用方式,通过具体实例阐述了指针、引用以及指向引用的指针的概念,帮助读者理解不同场景下变量的正确使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++中指针和应用的不同混用方式往往具有截然不同的语义,所以这里详细地对几种指针和引用的混用方式进行区分,指针和引用的混用常见的如下面几种:

int i;
int *a = &i;		//这里a是一个指针,它指向变量i
int &b = i;		    //这里b是一个引用,它是变量i的引用(别名)
int * &c = a;		//这里c是一个引用,它是指针a的引用
int & *d;	        //这里d是一个指针,它指向引用,但引用不是实体,所以这是错误的

区分技巧:在分析上面代码时,可以从变量标识符开始从右往左看,最靠近标识符的是变量的本质类型,而再往左即为对变量类型的进一步修饰。

举例 :

int * & a;

标识符a的左边紧邻的是&,证明a是一个引用变量,而再往左是*,可见a是一个指针的引用,再往左是int,可见a是一个指向int类型的指针的引用。

### 解析 C++ 中 `int**` 和 `int*&` #### 定义区别 - **双重指针 (`int**`)** 双重指针是指向指针的指针。这意味着它存储的是另一个指针变量的地址,而该另一指针又指向一个整数类型的对象。 - **指针引用 (`int* &`)** 指针引用是一个引用类型,绑定到某个特定的指针上。这使得通过这个引用可以修改原始指针所指向的内容或改变其本身指向的位置[^1]。 #### 使用场景差异 当声明为 `int** a` 时,表示创建了一个新的指针变量来保存其他指针的地址;而对于 `int* &a` 来说,则是对现有指针的一个别名或者说是一种间接访问方式,允许直接操作原指针而不必担心额外分配空间给新变量。 下面给出具体的例子以便更清晰地展示两者的不同之处: ```cpp #include <iostream> using namespace std; void modifyDoublePointer(int** ptr){ *ptr = new int(9); // 修改实际内存位置中的值 } void modifyReferenceToPointer(int*& refPtr){ refPtr = new int(7); // 改变refPtr本身的指向并更新其所指内容 } int main(){ int num = 0; { int* singlePtr = nullptr; modifyDoublePointer(&singlePtr); cout << "*singlePtr after modification via double pointer: " << *singlePtr << endl; // 输出应为9 delete singlePtr; // 清理动态分配的空间 } { int* anotherSinglePtr = nullptr; modifyReferenceToPointer(anotherSinglePtr); cout << "*anotherSinglePtr after modification via reference to pointer: " << *anotherSinglePtr << endl; // 输出也应该是7 delete anotherSinglePtr; // 同样清理资源 } return 0; } ``` 在这个程序里可以看到,无论是通过传递双重指针还是指针引用的方式都可以实现对外部定义好的单层指针的操作,但是它们内部的工作机制完全不同。前者需要传入目标指针的地址从而获得对其内容写权限,后者则是作为原有实体的新名字来进行交互。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值