2020-12-13:一文读懂“&引用”、“&取地址”和“*解析地址”的使用

一文读懂“&引用”、“&取地址”和“*解析地址”的使用

C++中才支持&引用的使用,C语言中仅支持&取地址,*解析地址的使用,请读到文章的同志们注意,谢谢!
& 引用
常规引用

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
作为引用的时候,必须在定义时候就进行初始化,若不进行初始化则会编译报错。

int N;
int &rN = N;

引用创建之后,后面操作创建的引用rN,也会同步到变量N上;

使用示例
#include <stdio.h>

int main()
{
	int N = 10;
	int &rN = N;
	rN = rN - 5;
	printf("N: %d\n", N);
	return 0;
}

*******
N: 5
*******
函数中使用引用function(int &i)

函数中传递形参如果是int &i的形式,也是变量的引用,具体示例如下

正常创建的函数
int function(int i){
	i++;
	return i;
}
使用引用变量作为形参的函数
int functionReference(int &i){
	i++;
	return i;
}
使用示例
int x = 5;
function(x);			// result: 6; x: 5
functionReference(x);	// result: 6; x: 6
& 取地址

&作为取地址用的时候,要跟指针联系在一起,因为指针就是用来存放地址的。
取地址就是你想取某变量(形参或者实参)的地址就用 & 前置表示要取地址了,取的是该变量的内存地址。

int N = 100;	// 定义变量N
int *p;			// 定义整形指针p
p = &N;			// 取变量N的地址,并使指针p指向改地址
使用示例
#include <stdio.h>
int main()
{
	int N = 100;
	int *p;
	p = &N;
	printf("N: %d\n", N);	// N的值
	printf("&N: %d\n", &N);	// N的地址
	printf("p: %d\n", p);	// p的值
	printf("*p: %d\n", *p);	// p存放的地址,取地址对应空间存放的值
	return 0;
}
&引用 和 &取地址的区别

引用的格式:
类型名 & 别名 = var;
1.定义的时候必须初始化,即& 前面有类名或类型名,&别名后面一定带 “=” (在= 左边);
2.&后面的别名是新的名字,之前不存在。

&取地址时:
如果&是取址运算符,也就意味着取一个变量的地址并付给指针变量。&后面紧跟的是变量(已存在);

* 解析地址,取地址空间中存放的值

*a表示:取出变量a中对应存储地址空间中的值;首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。

int a;

变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。
所以a本来代表两个值:存储单元的地址和储单元中的数据。
于是就有了二异性。
为了消除这种二义性,C语言规定a表示存储单元中的数据,&a表示存储单元的地址。
a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b;
语句就是将b的存储单元的地址存入a存储单元中。C语言规定*a代表a中存储的地址对应的存储单元中的数据,也就是访问*a就等于访问b,于是*a提供了通过a访问b中的数据的手段。

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

使用示例
int a = 12;
int *b;
b = &a;
printf("a: %d\n", a);  	// 12
printf("b: %d\n", b);	// 6422024
printf("*b: %d\n", *b);	// 12

最后,在C语言里地址叫指针。还有,在C语言中的数组本质上其实也是指针,即:*a 等同于 a[]。
至于数组和指针之间的实践,可以参考另外一篇实践;

C++语言中采用&引用的使用;C语言没有&引用,在此说明,请注意!!!

完整示例如下:
#include <stdio.h>

int function(int i){
	i++;
	return i;
}

int functionReference(int &i){
	i++;
	return i;
}

int main()
{
	int N;
	int &rN = N;
	N = 10;
	rN -= 5;
	printf("N: %d\n", N);
	int i = 100;
	printf("i: %d\n", i);
	printf("function(i): %d\n", function(i));
	printf("i: %d\n", i);
	printf("functionReference(i): %d\n", functionReference(i));
	printf("i: %d\n", i);
	return 0;
}
PS

主要介绍 &引用、&取地址和*解析地址的使用和区别,仅为记录总结之用!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值