C和C++的参数传递

下面是值传递,a和b的值会被传入到swap1中,如果你修改了这个值,main方法中的值是不会改变的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>

void swap1(int a, int b) {
printf("a = %d ,ptr = %p\n", a, &a);
printf("b = %d ,ptr = %p\n", b, &b);
int tmp = b;
b = a;
a = tmp;
printf("a = %d ,ptr = %p\n", a, &a);
printf("b = %d ,ptr = %p\n\n", b, &b);
printf("swap leave\n");
}

int main() {
int x = 1;
int y = 2;
printf("x = %d, ptr = %p\n", x, &x);
printf("y = %d, ptr = %p\n\n", y, &y);
swap1(x, y);
printf("x = %d, ptr = %p\n", x, &x);
printf("y = %d, ptr = %p\n\n", y, &y);
return 0;
}

下面是地址传递,顾名思义传到swap中的是寄存器的地址

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>

void swap2(int *a, int *b) {
printf("a = %d ,ptr = %p\n", a, &a);
printf("b = %d ,ptr = %p\n", b, &b);
int tmp = *b;
*b = *a;
*a = tmp;
printf("a = %d ,ptr = %p\n", a, &a);
printf("b = %d ,ptr = %p\n\n", b, &b);
printf("swap leave\n");
}

C++的出现优化了C语言中的地址传递,因为那真的不太友好。这个和Java很相似

1
2
3
4
5
6
7
8
9
10
11
12
13
void swap3(int &a, int &b) {
printf("swap enter\n");
printf("a = %d, ptr = %p\n", a, &a);
printf("b = %d, ptr = %p\n", b, &b);

int tmp = b;
b = a;
a = tmp;

printf("a = %d, ptr = %p\n", a, &a);
printf("b = %d, ptr = %p\n", b, &b);
printf("swap leave\n");
}