交换两个元素的值,有传指针和传引用两种方式,这里需要注意的是引用一旦定义必须赋值,一旦赋值不能更改,对象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 #include2 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\n", a, b);32 a = 1, b = 2;33 swap2(&a, &b);34 printf("传入指针,a = %d, b = %d\n", a, b);35 a = 1, b = 2;36 int *i = &a;37 int *j = &b;38 printf("传入指针引用前,a = %d, b = %d\n", a, b);39 printf("传入指针引用前,i = %d, i = %d\n", *i, *j);40 swap3(i, j);41 printf("传入指针引用后,a = %d, b = %d\n", a, b);42 printf("传入指针引用后,i = %d, i = %d\n", *i, *j);43 44 scanf("%d", &a);45 return 0;46 }
运行结果,与前图分析的完全相同