指针的引用 *&

void swap(int* p1, int* p2) { // 这里的指针p1实际是副本
	cout << &p1 << " " << &p2 << endl;
}
void test() {
	int a = 1, b = 3;
	int* p1 = &a, * p2 = &b;
	cout << &p1 << " " << &p2 << endl;
	swap(p1, p2);
}

运行结果:

指针p1 p2地址:000000241AB8F708 000000241AB8F728
指针p1 p2地址:000000241AB8F6A0 000000241AB8F6A8

void swap(int* &p1, int* &p2) { // 
	cout << &p1 << " " << &p2 << endl;
}
void test() {
	int a = 1, b = 3;
	int* p1 = &a, * p2 = &b;
	cout << &p1 << " " << &p2 << endl;
	swap(p1, p2);
}

运行结果

指针p1 p2地址:000000D1371DFA78 000000D1371DFA98
指针p1 p2地址:000000D1371DFA78 000000D1371DFA98

结论:通俗来讲就是对指针进行引用,没有进行拷贝指针,在函数体内对指针的修改是全局的。

&lt;think&gt;好的,我现在需要仔细分析用户提出的C语言问题。题目是给出四个表达式:*&amp;p、*&amp;x、&amp;*x、&amp;*p,其中哪个是错误的。用户提供的代码片段是`float x, *p = &amp;x;`,所以首先我要明确各个变量和指针的关系。 首先,我需要回忆C语言中指针和运算符的基本概念。指针变量存储的是另一个变量的地址,而取地址运算符&amp;用于获取变量的地址,解引用运算符*用于访问指针所指向的值。 让我们先分解代码:`float x, *p = &amp;x;`。这里声明了一个浮点变量x和一个指向浮点的指针p,并且p被初始化为x的地址。因此,p指向x,即p的值是&amp;x,而*p就是x的值。 接下来逐个分析四个表达式: 1. **\*&amp;p**:首先,&amp;p是获取指针p本身的地址,这个地址的类型是float**(指向float指针指针)。然后,对这个地址进行解引用操作,即*&amp;p,得到的是p本身,也就是p的值,即x的地址。所以这个表达式是正确的,类型是float*。 2. **\*&amp;x**:这里&amp;x是获取变量x的地址,类型是float*。解引用这个地址,即*&amp;x,等同于x本身,所以这个表达式是正确的,类型是float。 3. **&amp;*x**:这一步需要先解引用x,但x是一个float类型的变量,不是指针。对非指针类型的变量使用解引用运算符*会导致编译错误,因为x不是一个指针,无法解引用。因此,这个表达式是错误的。 4. **&amp;*p**:p是一个指向float的指针*p解引用得到x的值,即float类型。然后取这个值的地址,即&amp;(*p),这相当于取x的地址,也就是p本身。所以这个表达式是正确的,等同于p,类型是float*。 现在需要确认每个步骤是否正确。特别是第三个表达式&amp;*x,是否真的错误。因为x是一个float变量,不是指针,所以*操作符无法应用在x上,这会引发编译错误。例如,在C语言中,如果尝试写*5,编译器会报错,因为5不是一个指针。同理,x是一个float,所以*x是非法的,导致整个表达式&amp;*x错误。 剩下的三个表达式虽然看起来有些绕,但都是合法的。例如,*&amp;p等同于p,因为先取p的地址再解引用&amp;*p等同于&amp;x,因为*p是x,取地址就是&amp;x,而p本身已经存储了&amp;x,所以这个表达式等同于p。而*&amp;x等同于x,也是正确的。 因此,错误的表达式是第三个:&amp;*x。&lt;/think&gt;让我们逐步分析表达式 `float x, *p = &amp;x;` 后的四个选项: ```c float x, *p = &amp;x; // p 是指向x的指针,存储x的地址 ``` ### 表达式分析: 1. **`*&amp;p`** - `&amp;p`:取指针变量 `p` 的地址,类型是 `float**` - `*&amp;p`:对地址解引用,得到 `p` 本身(即 `p` 的值,也就是 `x` 的地址) - **合法**,等价于 `p`,类型为 `float*` 2. **`*&amp;x`** - `&amp;x`:取变量 `x` 的地址,类型是 `float*` - `*&amp;x`:对地址解引用,得到 `x` 本身 - **合法**,等价于 `x`,类型为 `float` 3. **`&amp;*x`** - `*x`:尝试解引用 `x`,但 `x` 是 `float` 类型,非指针**非法操作** - 编译器会报错:`invalid type argument of unary &#39;*&#39;` 4. **`&amp;*p`** - `*p`:解引用指针 `p`,得到 `x` 的值,类型是 `float` - `&amp;*p`:取 `x` 的地址,等价于 `p` - **合法**,类型为 `float*` ### 错误原因总结: - **`&amp;*x`** 是唯一错误表达式:`x` 是基本类型变量,不能使用解引用运算符 `*`。 ### 附:表达式类型验证表 | 表达式 | 类型 | 合法性 | |--------|-----------|--------| | `*&amp;p` | `float*` | ✔️ | | `*&amp;x` | `float` | ✔️ | | `&amp;*x` | 无(错误)| ❌ | | `&amp;*p` | `float*` | ✔️ | **结论**:错误的表达式是 **`&amp;*x`**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值