通过使用引用操作符 “&” 来理解指针变量与变量之间的关系

通过使用引用操作符 “&” 来理解指针变量与变量之间的关系

写这篇博客的原因:
在学习C语言的过程中,总是需要在主函数中调用自定义函数,有时需要将主函数中的变量作为实际参数(实参)传入自定义函数,但是传入自定义函数中的变量与主函数中的变量并不共用同一个地址,即修改传入自定义函数中变量的值不会导致主函数中变量值的改变。因此为了能够使自定义函数能直接修改主函数中变量的值使用了引用操作符“&”。因此我发现在C语言初学者第一次接触到指针时,通过对比使用引用操作符能够更加简单、直观的理解指针变量。

简单理解什么是指针

在谈论指针前,我们需要知道一个变量在计算机中不是随便存在的,需要在计算机内存中开辟一块连续的内存空间来存放。而每一块内存空间都有一个相应的地址,计算机通过访问对应的地址,来获取存放在这块内存空间的变量的值。
通过下面的图给大家举个例子。实际情况下不同类型的变量存储所占用的内存空间是不同的,如需了解这方面的知识请自行查询其它资料。
示例

简单理解,指针!指针!就是有指向的意思。在计算机中一个内存地址“指向”一个变量,在C语言中则用指针表示内存地址(即指针指向一个内存地址),如果碰巧在这块内存地址里存放了某个变量,就称“该指针指向某个变量”-----关于指针详细的定义请自行参考其它资料

引用操作符“&”

在学了C语言最基础的输出函数scanf()时,我们就接触到过取地址符“&”,通过&+变量名来获取用于存放该变量的内存地址。

scanf("%d",&a);//取地址符&

但是请务必不要将取地址符“&”和引用操作符“&”混淆-----两者是不一样的东西。

引用操作符的作用:在自定义函数定义形参时使用引用操作符,表示输入到自定义函数中使用的变量和主函数用的变量是同一个,即自定义函数中此变量值改变时,主函数中此变量值也同时改变。

void Change(int* &x,int* &y)//引用操作符&
{	
	printf("%d,%d\n",x,y);
	int* temp = x;
	x = y;
	y = temp;
	printf("%d,%d\n",x,y);
}

指针变量和星号 “ * ”

指针变量常用于存储某变量的内存地址。格式可以是int(其它类型也行)后直接加“ * ” 空格再更变量名----int* a,也可以紧跟着变量名称(如下例子中的形式)。

例:int *a = &b;即指针变量a中存放的是变量b的地址。

为了让初学者更好理解指针变量,因此我使用int* a形式来说明。int*和int一样代表的是变量类型,int*指创建的是指针变量,int指创建整形变量。
在int* a中a才是指针变量的变量名。int *a格式同理,变量名是a而不是”*a“。*a=a中存放的变量,请不要搞错了。

代码及分析部分

代码分为两个部分第一部分是不使用引用操作符的代码,第二部分代码是使用引用操作符的代码。两个代码的唯一区别就是有无使用引用操作符,请读者对比两个代码的运行结果来理解。

不使用引用操作符的代码

#include<stdio.h>
int a = 1,b = 2;
int *x = &a,*y = &b;
void Change(int* x,int* y)
{	
	printf("%d,%d\n",x,y);
	int* temp = x;
	x = y;
	y = temp;
	printf("%d,%d\n",x,y);
}
int main()
{

	printf("%d,%d\n",a,b);
	printf("%d,%d\n",&a,&b);
	Change(x,y);
	printf("%d,%d\n",a,b);
	printf("%d,%d\n",&a,&b);
	printf("%d,%d\n",*x,*y);
	return 0;
}

运行结果
运行结果

使用引用操作符代码

#include<stdio.h>
int a = 1,b = 2;
int *x = &a,*y = &b;
void Change(int* &x,int* &y)
{	
	printf("%d,%d\n",x,y);
	int* temp = x;
	x = y;
	y = temp;
	printf("%d,%d\n",x,y);
}
int main()
{

	printf("%d,%d\n",a,b);
	printf("%d,%d\n",&a,&b);
	Change(x,y);
	printf("%d,%d\n",a,b);
	printf("%d,%d\n",&a,&b);
	printf("%d,%d\n",*x,*y);
	return 0;
}

运行结果
运行结果

对比分析部分

前两个printf是为了显示初始状态下变量a,b的值及对应存放的地址。
为了方便,图中地址只取实验结果中的后两位。
图
创建了两个整形变量a = 1和b =2分别纯如了地址08和04中,再将a的地址08赋值给指针变量x,将b的地址赋04赋值给指针变量y。

自定义函数change的作用是将x和y的值进行互换。但是由于代码一中没有使用引用字符&,所以在change函数中进行互换的x,y并不是主函数中的指针变量x、y。因此在返回主函数后重新输出后结果和开始时测试的一样。

但是在代码二中使用了引用字符&,因此它将主函数中存放在地址指针x、y中的地址互换了。见下图。
对应关系
在change函数前定义指针变量x等于变量a的地址(x=08),此时x指向变量a所以*x=1,同理*y=2。但是在change函数后指针变量x与y中存放的地址互换,即指针变量x指向地址04(x=04),因此*x所代表的内容也转变为了内存地址04中存放的变量b,所以*x=2。

然而变量a与b的值和存放它们的内存地址没有改变,由此可见指针变量只是用于存放内存地址的工具,只能通过指针变量获取指针变量对应的地址内的变量的内容,而无法修改此地址内部变量的值。因此修改指针变量的值,只是修改了指针变量对应的内存地址,而不是修改了原本内存地址的值和其内部存放的变量值。所以指针变量和存在内存中的变量没有直接关系。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值