交换两个元素的值,有传指针和传引用两种方式,这里需要注意的是引用一旦定义必须赋值,一旦赋值不能更改,对象a的引用就是a的别名(alias)。
(1)int &a;//a是int类型的引用
(2)int *a;//a是int类型的指针
(3)int *&a;//a是int*类型的引用,也就是a是指针的引用
可以用下面示意图解释
第一种交换方式,传递引用,swap1(int &x, int &y);第二种方式,传递指针swap2(int *x, int *y),第三种方式传递指针引用swap3(int*(&x), int*(&y))。分别如下所示
可以看到第一、二种方式交换的是数值,第三种方式交换的是指针。
附代码
1 #include <stdio.h> 2 3 4 void swap1(int &x, int &y) 5 { 6 int temp = x; 7 x = y; 8 y = temp; 9 } 10 11 void swap2(int *x, int *y) 12 { 13 int temp; 14 temp = *x; 15 *x = *y; 16 *y = temp; 17 } 18 19 void swap3(int*(&x), int*(&y)) 20 { 21 int *temp; 22 temp = x; 23 x = y; 24 y = temp; 25 } 26 27 int main() 28 { 29 int a = 1, b = 2; 30 swap1(a, b); 31 printf("传入引用,a = %d, b = %d ", a, b); 32 a = 1, b = 2; 33 swap2(&a, &b); 34 printf("传入指针,a = %d, b = %d ", a, b); 35 a = 1, b = 2; 36 int *i = &a; 37 int *j = &b; 38 printf("传入指针引用前,a = %d, b = %d ", a, b); 39 printf("传入指针引用前,i = %d, i = %d ", *i, *j); 40 swap3(i, j); 41 printf("传入指针引用后,a = %d, b = %d ", a, b); 42 printf("传入指针引用后,i = %d, i = %d ", *i, *j); 43 44 scanf("%d", &a); 45 return 0; 46 }
运行结果,与前图分析的完全相同