下面这段代码,fun函数能实现x,y的值交换,本人能够理解,那是原因是调用函数的时候传递的是x,y的地址,在函数内操作地址内的值实现了值的交换。
但是对fun1()函数,本人有点不太了解,调用fun1()函数,参数为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);
形参为引用,
实参传递的时候,传递的是(封装好的指针)引用。
实际上这两个函数生成的汇编代码相同。
也就是实现上,指针,引用并没有重大区别
区别在语法,和称谓上。
区别在编码上。
编写代码的时候,指针和引用是两种东西
编译后,多数时候,二者没有太大的区分(几乎一样)。
因此,对引用做的一切,都是对被引用的对象做的
实现上,也就是用指针实现的,起码很多编译器是把引用实现为指针的。
引用,只是封装一下指针。所以也很容易实现。
真正的语法糖,就是 fun1(x,y);
形参为引用,
实参传递的时候,传递的是(封装好的指针)引用。
实际上这两个函数生成的汇编代码相同。
也就是实现上,指针,引用并没有重大区别
区别在语法,和称谓上。
区别在编码上。
编写代码的时候,指针和引用是两种东西
编译后,多数时候,二者没有太大的区分(几乎一样)。
3
C++引用,只要抽象语义理解了,就可以了
具体怎么样实现,是实现语义的问题
C++没有定义引用的实现语义,
虽然大家实现引用的方法,其实是一致的。
具体怎么样实现,是实现语义的问题
C++没有定义引用的实现语义,
虽然大家实现引用的方法,其实是一致的。
3
二楼说的很对,引用其实就是编译器帮你“封装”好的指针,为的就是你书写方便
建议理解一下“变量类型”这个概念,假如a是一个指针变量,那*a是取里面的内容
假如a是一个引用变量,那a就是取里面的内容,再*a就错了,两个a的类型不同,编译器对其“理解”不同
建议理解一下“变量类型”这个概念,假如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