关于符号&用于引用与取地址的区别

符号&有多种用法,这篇文章讨论其作为引用与取地址的区别。

1.&作为引用:可理解为给变量取别名

	int a=6;
	int &b=a; 	

声明了b是a的一个引用,是a的一个专属别名,故b不能再作为别的变量的引用,即不能继续有&b=c。

	int &c=a;  // a可以被多次引用,即被多次起别名
	int &d=b;  // b也可以被引用

对引用b进行赋值、运算等操作,即是对被引用的对象a进行赋值、运算操作,a对应的地址中的数值改变,但a还是a,表示的地址不变

	b--;printf("%d\n",a); //此时a=5.对引用b的操作即是对a本身的操作
	b=4;printf("%d\n",a); //此时a=4,但b还是a的别名 

引用时需要初始化,即引用不能为空,故有int b;,但不能有 int &b;

以swap函数实现为例阐述引用的作用。

inline void swap(int x,int y){
	int t=x;
	x=y;
	y=t;
} 
inline void swap1(int &x,int &y){
	int t=x;
	x=y;
	y=t;
} 
int main(){
	swap(a,b);//未成功交换 
	swap1(a,b);//成功交换 
}

此处等价于&x=a,&y=b。然后x与y对应的数交换,即a与b交换。
故此处的&为引用。

判断引用的方式
1.定义的时候必须初始化,即&前面有类名或类型名,&后面一定带 “=”。
2.&后面的名字是新的名字,之前不存在。故此处的函数形参也为引用。

2.&作为取地址,需与指针配合使用。

把内存中某一个地址命名为a,并放入某一数值,&a即代表该数值所在的地址

指针及其应用。

int *x;x=&a;

上式定义了一个指针x,则x的值就代表指向的地址,x代表取出指向地址中的数值。初始指针未定义指向时,默认指向NULL,故指针可以指向空
指针指向的是地址,而不是变量名。不能写
x=&a。

int *x=&a;

可以把int *看成一个类型名,代表指针,故应为x等于某个地址,即&a。

x=&b;

指针可以多次定义所指向的地址,而引用对应的地址唯一。

x++;

此时是对指针直接进行修改,改变了指针指向的地址,故*x不再指向b所在的地址中的数值。

(*x)++; 

可以直接对指针指向的内容进行修改,代表指针指向的地址中的数值加1。
注意:必须要加括号,否则加一的优先级更高,会导致x指向的地址改变。

特别注意:对指针进行取值操作之前一定要判断指针是否指向NULL,而对引用操作则无需判断是否为空。

inline void swap(int *x,int *y){
	int t=*x;  //t是数值,不能为t=x; 
	*x=*y;
	*y=t;
} 
int main(){
	swap(&a,&b);
} 
//此处直接进行等于操作的话,相当于int *x=&a   
inline void swap1(int *x,int *y){
	int *t=x;  //t是指针,不能为t=*x; 
	*x=*y;
	*y=*t;
} //错误原因,*t与*x指向同一地址,当*x=*y后,*t也变成了*y 
inline void swap2(int *x,int *y){
	int *t=x;
	x=y;
	y=t;
} // 错误原因:只改变了两个指针的指向,并不影响地址中的数值 

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

两种正确的swap函数的写法:

inline void swap(int &x,int &y){
	int t=x;
	x=y;
	y=t;
} 
inline void swap(int *x,int *y){
	int t=*x;  //t是数值,不能为t=x; 
	*x=*y;
	*y=t;
} 
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值