C语言中的形参传递
值传递
#include <stdlib.h>
#include <stdio.h>
void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */
{
printf("x地址 = %p, y地址 = %p.\n", &x, &y);
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d.\n", x, y);
}
int main(void)
{
int a = 4;
int b = 6;
printf("a的地址%p\n", &a);
printf("b的地址%p\n", &b);
Exchg1(a, b);
printf("a = %d, b = %d.\n", a, b);
printf("a的地址%p\n", &a);
printf("b的地址%p\n", &b);
return 0;
}
Exchg1为值传递,形参x、y为传入参数的复制值
a的地址000000000061fe1c
b的地址000000000061fe18
x地址 = 000000000061fdf0, y地址 = 000000000061fdf8.
x = 6, y = 4.
a = 4, b = 6.
a的地址000000000061fe1c
b的地址000000000061fe18
地址传递
#include <stdlib.h>
#include <stdio.h>
void Exchg2(int *px, int *py)
{
printf("px的值%p\n", px);
printf("py的值%p\n", py);
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d.\n", *px, *py);
}
int main(void)
{
int a = 4;
int b = 6;
printf("a的地址%p\n", &a);
printf("b的地址%p\n", &b);
Exchg2(&a, &b);
printf("a = %d, b = %d.\n", a, b);
printf("a的地址%p\n", &a);
printf("b的地址%p\n", &b);
return 0;
}
打印语句如下
a的地址000000000061fe1c
b的地址000000000061fe18
px的值000000000061fe1c
py的值000000000061fe18
*px = 6, *py = 4.
a = 6, b = 4.
a的地址000000000061fe1c
b的地址000000000061fe18
引用传递(C不存在引用传递,C++中试验)
#include <stdlib.h>
#include <stdio.h>
/* 注意定义处的形式参数的格式与值传递不同 */
void Exchg3(int &x, int &y)
{
printf("x地址 = %p, y地址 = %p.\n", &x, &y);
int tmp = x;
x = y;
y = tmp;
printf("x地址 = %p, y地址 = %p.\n", &x, &y);
printf("x = %d, y = %d.\n", x, y);
}
int main(void)
{
int a = 4;
int b = 6;
printf("a的地址%p\n", &a);
printf("b的地址%p\n", &b);
Exchg3(a, b);
printf("a = %d, b = %d.\n", a, b);
printf("a的地址%p\n", &a);
printf("b的地址%p\n", &b);
return 0;
}
与值传递中唯一变化的地方在于形参中添加取地址符号&,形参x、y的地址与a、b的地址相同
a的地址000000000061fe1c
b的地址000000000061fe18
x地址 = 000000000061fe1c, y地址 = 000000000061fe18.
x地址 = 000000000061fe1c, y地址 = 000000000061fe18.
x = 6, y = 4.
a = 6, b = 4.
a的地址000000000061fe1c
b的地址000000000061fe18