【C++学习】int* int** int*** &a

本文介绍了C语言中指针的概念,包括变量的值与地址、指针变量的声明和使用,以及多级指针如何指向和取值。通过示例代码展示了如何通过指针操作内存地址,包括*a表示取地址的内容,&a表示变量的地址,以及***d用于沿着指针链获取原始变量的值。

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

c中有二异性,一个变量有地址,有存储的值,所以a表示值,&a表示地址用以区分

a表示a对应的存储单元中的数据。

&a表示a对应的存储单元的地址。

*a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。 于是,*a表示另一个存储单元中的数据。*:根据地址取值。

int* a 表示a是个指针,存储地址,并且是int型,即地址对应取到的值是int

*在申明变量时表示该变量存储指针,在变量前表示取该变量中存储地址的值

***d可以连取,顺着指针往回走取到a

&&a没有这种用法,不能取到地址的地址,只能取变量的地址(指针不能倒着查找)

#include <stdio.h>
#define PI 3
int main() {

	int a = 10;
	int* b = &a;
	int** c = &b;
	int*** d = &c;
	printf(" a是int变量 b c d都是int型指针\n b指向c,c指向b,b指向a\n\n");
	printf(" a的值: % d\n", a);
	printf(" &a,a的地址: % d\n\n", &a);
	printf(" b的值,即a的地址: % d \n\n", b);
	printf(" c的值,b的地址: % d\n\n", c);
	printf(" *c即c存储地址的值,即b的值,即a的地址: % d\n", *c);
	printf(" d的值,c的地址: % d\n\n", d);
	printf(" &d d的地址,与以上无关: % d\n\n", &d);
	printf(" *d即d存储地址的值,即c的值,即b的地址: % d,*d==c:%d ,c==&b:%d\n\n", *d, *d == c, c == &b);
	printf(" ***d:根据指针往上取到a的值 % d,***d==a: %d\n\n", ***d, ***d==a);
	printf("指针取其地址所对应的值,再取地址,肯定等于原指针保存的地址值\n\n");
	printf(" b==&*b: % d\n", b==&*b);
	printf(" b==&b: % d\n", b==&b);

}

 左值:可修改的值 

0x开头 16进制

0开头 8进制

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值