指针与引用对值的交换疑问

C++语言 码拜 9年前 (2016-05-07) 1056次浏览
下面这段代码,fun函数能实现x,y的值交换,本人能够理解,那是原因是调用函数的时候传递的是x,y的地址,在函数内操作地址内的值实现了值的交换。
但是对fun1()函数,本人有点不太了解,调用fun1()函数,参数为x,y变量本身,这里是不是将x,y的地址自动转换为引用传递了?而即使是转换成了地址,在函数内部也应该用*号操作呀,而函数内部直接就对引用操作就实现了值的交换,有点蒙,哪位高手能详细说下原理,谢谢

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void fun(int *a, int *b)
{
	int c=0;
	c=*a;
	*a=*b;
	*b=c;
}
void fun1(int &a, int &b)
{
	int c=0;
	c=a;
	a=b;
	b=c;
}
int main()
{
	int x=10;
	int y=20;
	printf("x=%d  y=%d",x,y);
	//fun(&x,&y);
	fun1(x,y);
	printf("\nx=%d  y=%d",x,y);
	getchar();
	return 0;
}
解决方案

10

a相当于x的别名(绰号),对a的任何操作就是对x的操作

15

原理是,引用是别名,引用和被引用者名异实同,都是同一个对象
因此,对引用做的一切,都是对被引用的对象做的
实现上,也就是用指针实现的,起码很多编译器是把引用实现为指针的。
引用,只是封装一下指针。所以也很容易实现。
真正的语法糖,就是 fun1(x,y);
形参为引用,
实参传递的时候,传递的是(封装好的指针)引用。
实际上这两个函数生成的汇编代码相同。
也就是实现上,指针,引用并没有重大区别
区别在语法,和称谓上。
区别在编码上。
编写代码的时候,指针和引用是两种东西
编译后,多数时候,二者没有太大的区分(几乎一样)。

3

C++引用,只要抽象语义理解了,就可以了
具体怎么样实现,是实现语义的问题
C++没有定义引用的实现语义,
虽然大家实现引用的方法,其实是一致的。

3

二楼说的很对,引用其实就是编译器帮你“封装”好的指针,为的就是你书写方便
建议理解一下“变量类型”这个概念,假如a是一个指针变量,那*a是取里面的内容
假如a是一个引用变量,那a就是取里面的内容,再*a就错了,两个a的类型不同,编译器对其“理解”不同

2

指针即地址
引用即别名

5

void fun(int *pa, int *pb)
{
    int c = *pa;
    *pa = *pb;
    *pb = c;
}
 
void fun(int &a, int &b)
{
    int c = a;
    a = b;
    b = c;
}

对于大多编译器而言,两者的内部实现是相同的,只是从书写上看起来引用更方便而已。

4

在汇编代码实现上,引用其实是按指针方式实现的

5

仅供参考:

#include <stdio.h>
#define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0)
char   *p1="1" ,*p2="2" ;
char    c1=1   , c2=2   ;
short   s1=1   , s2=2   ;
int     i1=1   , i2=2   ;
__int64 I1=1i64, I2=2i64;
float   f1=1.0f, f2=2.0f;
double  d1=1.0 , d2=2.0 ;
void main() {
    SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);
    SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);
    SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);
    SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);
    SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);
    SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);
    SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);
    SWAP(c1,c1);
    printf("%d\n",c1);
}
//char *         2,       1
//char           2,       1
//short          2,       1
//int            2,       1
//__int64     2,    1
//float          2,       1
//double        2,      1
//2

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明指针与引用对值的交换疑问
喜欢 (0)
[1034331897@qq.com]
分享 (0)