- 引用作为变量别名而存在,因此在一些场合可以代替指针
- 引用相对于指针来说具有更好的可读性和实用性
下面通过代码来进行说明,在C语言中,可以这么写:
#includevoid swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } int main() { int a = 1; int b = 2; swap(&a, &b); printf("a = %d, b = %dn", a, b); return 0; }
下面为输出结果,可以看到a,b被交换。
若采用C++用的引用,则采用下面的代码:
#includevoid swap(int& a, int& b) { int t = a; a = b; b = t; } int main() { int a = 1; int b = 2; swap(a, b); printf("a = %d, b = %dn", a, b); return 0; }
下面为输出结果,需要注意的是, 引用作为函数的形参时,不需要进行初始化,初始化发生在函数调用的时候(形参一旦被初始化后,就代表两个具体的外部变量)。
二、特殊的引用- const 引用
- 在C++中可以声明const 引用
- const Type& name = var ;
- const 引用让变量拥有只读属性
- 当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
所以上面那段代码,b = 5 是不正确的,因为 b 已经是只读变量了,但是依旧可以通过指针改变这个只读变量的值。
结论:使用常量对const 引用初始化后将生成一个只读变量
下面看一段代码,加深理解:
#includevoid Example() { printf("Example:n"); int a = 4; const int& b = a; int* p = (int*)&b; //b = 5; *p = 5; printf("a = %dn", a); printf("b = %dn", b); } void Demo() { printf("Demo:n"); const int& c = 1; int* p = (int*)&c; //c = 5; *p = 5; printf("c = %dn", c); } int main(int argc, char *argv[]) { Example(); printf("n"); Demo(); return 0; }
下面为输出结果:
如果把那两行(b = 1,c = 5)取消注释,则就会输出下面结果,编译器会报 b 和 c 都是只读变量的错误。



