例: int&
这里的&不是取地址符号,而是引用符号,引用是C++对C的一个重要补充。变量的引用就是
变量的别名,讲的通俗一点就是另外一个名字,比如:“张三这个人在家里,老爸老妈叫他
三娃子,那么这个三娃子就是指张三这个人,如果叫张三去做某事,就是叫三娃子去做某事,
这两个名字指的是同一个人。”同样可以理解如果变量b是变量a的引用 那么无论a,b中任
何一个值改变,另外一个也相应的改变。
a)声明引用时必须指定它代表的是哪一个变量,即对它初始化。
int &a=b;这样是声明a是变量b的引用
如果是int &a;这样就是错的,没有指定a代表哪一个变量。
b)引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储单元;
这个应该好理解;就像前面所说的,张三和三娃子都是同一个人,三娃子只是张三的别名。
因此,对于 int &a=b;这个例子来说,要输出a和b 的地址,肯定是相同的。
1. int
1 #include <iostream> 2 using namespace std; 3 4 void swap1(int a, int b){ 5 int tmp; 6 tmp = a; 7 a = b; 8 b = tmp; 9 } 10 int main(){ 11 int a = 1; 12 int b = 2; 13 swap1(a, b); 14 cout<<"a = "<<a<<endl; 15 cout<<"b = "<<b<<endl; 16 system("pause"); 17 return 0; 18 }
交换失败。这样的交换只是交换了形参的值,是无法达到交换值的效果的,这段程序很简单,不做细说。
2. int*
#include <iostream> using namespace std; void swap2(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp; } int main(){ int a = 1; int b = 2; swap2(&a, &b); cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; system("pause"); return 0; }
交换成功。上面是的swap2接受的参数是地址,我们传入地址,就可以直接操作实参的值了。
3. int&
#include <iostream> using namespace std; void swap3(int& a, int& b){ int tmp; tmp = a; a = b; b = tmp; } int main(){ int a = 1; int b = 2; swap3(a, b); cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; system("pause"); return 0; }
交换成功。引用即别名,通过引用也是可以直接访问到实参和控制实参的。
4. int*&
#include <iostream> 2 using namespace std; 3 4 void swap5(int *&a, int *&b){ 5 int tem = *a; 6 *a = *b; 7 *b = tem; 8 } 9 10 int main(){ 11 int a = 1; 12 int b = 2; 13 14 int *aPtr = &a; 15 int *bPtr = &b; 16 int *&arPtr = aPtr; 17 int *&brPtr = bPtr; 18 19 swap5(arPtr, brPtr); 20 21 cout<<"a = "<<a<<endl; 22 cout<<"b = "<<b<<endl; 23 system("pause"); 24 return 0; 25 }
交换成功。这个稍微复杂一点,int*& value这样一个声明,我们从最接近value的符号看起,是个&,说明value是一个引用,它是一个什么引用呢?再看*,它是一个指针的引用,即指针的别名,我们用*value就可以访问到实参的值了。所以,其交换函数的内部逻辑跟int *是一样的。
5. int &*
交换成功。这样定义就不合法,如果从字面上来看,我们分析一下,如int &* value,最接近value的是*,说明value是一个指针,再看前面的是&,说明是一个指针的引用,而指针是无法被引用的,所以,这样的定义是不合法的,不要记这个。
6. int**
1 #include <iostream> 2 using namespace std; 3 4 void swap6(int **a, int **b){ 5 int tmp; 6 tmp = **a; 7 **a = **b; 8 **b = tmp; 9 } 10 11 int main(){ 12 int a = 1; 13 int b = 2; 14 int *aPtr = &a;//指向数据的指针 15 int *bPtr = &b;//指向数据的指针 16 int **aaPtr = &aPtr;//指向指针的地址的指针 17 int **bbPtr = &bPtr;//指向指针的地址的指针 18 swap4(aaPtr, bbPtr); 19 cout<<"a = "<<a<<endl; 20 cout<<"b = "<<b<<endl; 21 system("pause"); 22 return 0; 23 }
交换成功。同样的,比如int **value, 最接近value的是*,说明value是一个指针,在前一个是*,说明是一个指向指针的指针,这样是合法的,那么如何访问value代表的实际参数的值呢?很简单,用**value就可以了,记住*是一个操作符,如同&一样,不过&是取地址操作符,而*是取值操作符。