2、引用的意义:
--引用作为变量名而存在,因此在一些场合可以代替指针。
--引用相对于指针来说具有更好的可读性和实用性。
下面举个经典的例子来对比一下:
(1)引用方式:
#include <stdio.h>
void swap(int& a,int& b)
{
int t = a;
a=b;
b=t;
}
int main(void)
{
int a =5;
int b =6;
printf("a=%d,b=%d",a,b);
swap(a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
演示结果:
root@txp:/home/txp# ./a.out
a=5,b=6
a=6,b=5
(2)指针方式:
#include <stdio.h>
void swap(int *a,int *b)
{
int t =*a;
*a=*b;
*b=t;
}
int main(void)
{
int a =5;
int b =6;
printf("a=%d,b=%d",a,b);
swap(&a,&b);
printf("a=%d,b=%d",a,b);
return 0;
}
演示结果:
root@txp:/home/txp# ./a.out
a=5,b=6
a=6,b=5
3、特殊的引用:
--在c++中可以声明const引用。
--const Type& name =var;
--const 引用让变量拥有只读属性。
--当使用常量对const引用进行初始化时,C++编译器会为常量分配空间,并将引用名作为这段空间的别名:
int a = 4;
const int& b =a;
int *p=(int *)&b;
b=5;//错误,只读变量
*p=5;//修改a的值
下面来看一个示例:
#include <stdio.h>
void Example()
{
printf("Example:");
int a = 4;
const int& b = a;
int* p = (int*)&b;
//b = 5;
*p = 5;
printf("a = %d", a);
printf("b = %d", b);
}
int main(int argc, char *argv[])
{
Example();
printf("");
return 0;
}
演示结果:
root@txp:/home/txp# ./a.out
Example:
a = 5
b = 5
4、引用有自己的存储空间吗?
话不多说,看试验就知晓:
#include <stdio.h>
struct TRef
{
char& r;
};
int main(int argc, char *argv[])
{
char c = 'c';
char& rc = c;
printf("sizeof(char&) = %d", sizeof(char&));
printf("sizeof(rc) = %d", sizeof(rc));
printf("sizeof(TRef) = %d", sizeof(TRef));
printf("sizeof(ref.r) = %d", sizeof(ref.r));
return 0;
}
演示结果:
root@txp:/home/txp# ./a.out
sizeof(char&) = 1
sizeof(rc) = 1
sizeof(TRef) = 8
sizeof(ref.r) = 1
很明显有它的内存大小,下面就来看一下引用的本质。