c++中&与*

本文详细解析了C++中的指针和引用的概念,通过实例展示了它们在内存地址、值的改变等方面的不同。并探讨了在函数参数中使用*和&的差异,解释了引用作为参数时如何直接修改实参值的特点,以及指针作为参数时可能改变指针本身存储地址的行为。
摘要由CSDN通过智能技术生成

第一个问题:

	int A = 2;
	int* p = &A;
	*p = 3;
	printf("A的值:%d\nA的地址:%d\n", A,&A);
	printf("p的值:%d\np的地址:%d\n", p, &p);

输出是什么?
在这里插入图片描述

int* p的*号表示声明一个指针
*p=3 的*表示对指针p中存储的地址进行解引用

int* p=&A
printf(“A的值:%d\nA的地址:%d\n”, A,&A);
printf(“p的值:%d\np的地址:%d\n”, p, &p);
&的意思是取A和指针p的地址
在这里插入图片描述

第二个问题:

	int A = 2;
	int& p = A;
		p = 5;
	printf("p的值:%d\np的地址:%d\n", p, &p);
	printf("A的值:%d\nA的地址:%d\n", A, &A);

输出是什么?
在这里插入图片描述
int& p=A

这里的&不再是对p取地址,而是引用的意思
通过结果可以发现,无论是地址还是值,p都与A相同,同时改变p的值,A也会一起改变,
简单来说,p就是A的另一个名字,同体不同名字。

&在变量定义区,表示引用

int& p = A;
&在变量操作区,表示取地址符

int* p = &A;

接下来再说一下让人最头疼的函数中参数是*,*&,&的区别
继续看例子:

void fun1(int& x)
{
	x = 25;
}
void fun2(int* x) {
	*x = 15;
	int k = 3;
	x = &k;
}
void fun3(int* &x)
{
	*x = 10;
	int k=4;
	x = &k;
}

注意: 在函数参数中&没有取地址的作用,只有引用的作用

fun1的参数是&x表示引用传入的实参
fun2的参数是int型指针
fun3的参数是引用传入的实参指针

通过代码来看一看,是怎么操作的:
先看第一个函数:

void fun1(int& x)
{
	printf("函数中参数的信息:\n");
	printf("x的地址:%d\n\n",&x);
	x = 25;
}
int main()
{
	int A = 5;
	printf("A的值:%d\nA的地址:%d\n\n", A, &A);
	fun1(A);
	printf("A的值:%d\nA的地址:%d\n", A, &A);
}

运行结果:
在这里插入图片描述
可以发现参数x,与实参A的地址都是一样的,

结论:
fun1(int& x)
函数参数中的引用,就相当于这个参数为这个实参的另一个名字,函数中的参数怎么改变,实参就怎么改变

再看第二个函数:

void fun2(int* x) {
	printf("函数中参数的信息(改变前):\n");
	printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x,x,*x);
	int temp = 10;
	*x = 15;
	x = &temp;
	printf("函数中参数的信息(改变后):\n");
	printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x, x, *x);
}
int main() {
	int A = 5;
	int* p = &A;
	printf("A的地址:%d\n\n", &A);
	printf("调用函数之前的信息:\n");
	printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
	fun2(p);
	printf("调用函数之后的信息:\n");
	printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
	printf("A的值:%d\n", A);
	}

运行结果:
A的地址:-1064306940

调用函数之前的信息:
指针p的地址:-1064306904
指针p所存储的地址: -1064306940
对指针p存储的地址解引用:5
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
函数中参数的信息(改变前):
指针x的地址:-1064306976
指针x存储的地址 -1064306940
对指针x存储的地址解引用5

函数中参数的信息(改变后):
指针x的地址:-1064306976
指针x存储的地址 -1064307228
对指针x存储的地址解引用10
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
调用函数之后的信息:
指针p的地址:-1064306904
指针p所存储的地址: -1064306940
对指针p存储的地址解引用:15

A的值:15

通过对结果的观察:
结论:
传入指针p,只是将指针p中的内容给了x,指针x在参数中的任何改变,都不会影响p的地址,p的存储内容。

第三个函数:

void fun3(int* &x)
{
	printf("函数中参数的信息(改变前):\n");
	printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x, x, *x);
	int temp = 5;
	*x = 10;
	x = &temp;
	printf("函数中参数的信息(改变后):\n");
	printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x, x, *x);
}
int main() {
	int A = 5;
	int* p = &A;
	printf("A的地址:%d\n\n", &A);
	printf("调用函数之前的信息:\n");
	printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
	fun3(p);
	printf("调用函数之后的信息:\n");
	printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
	printf("A的值:%d\n", A);
	}

代码和第二个函数基本一样,主要改变的就是传入参数的符号*&

A的地址:-258999548

调用函数之前的信息:
指针p的地址:-258999512
指针p所存储的地址: -258999548
对指针p存储的地址解引用:5

函数中参数的信息(改变前):
指针x的地址:-258999512
指针x存储的地址 -258999548
对指针x存储的地址解引用5

函数中参数的信息(改变后):
指针x的地址:-258999512
指针x存储的地址 -258999836
对指针x存储的地址解引用5

调用函数之后的信息:
指针p的地址:-258999512
指针p所存储的地址: -258999836
对指针p存储的地址解引用:-858993460

A的值:10

通过观察结果我们的出结论:
传给参数x的指针p,指针x在参数中怎么改变,指针p就怎么改变
还是和之前一样,这个参数就相当于是传入实参的另一个别名

  • 13
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值