C语言讲义——传值、传引用
传值
值类型在做参数的时候,函数内使用的是实参的副本。
函数执行完毕后,即使函数内对参数做了修改,调用方的参数还是原来的值。
#include <stdio.h>
// 值调用
void swap_value(int x, int y) {
int temp = x;
x = y;
y = temp;
}
main() {
int x = 0;
int y = 1;
printf("x = %d, y = %d\n", x, y);
swap_value(x, y);
printf("传值调用后:x = %d, y = %d\n", x, y);
}
运行结果:
x = 0, y = 1
传值调用后:x = 0, y = 1
传引用
将地址传入参数,在地址指向的内存空间中修改具体的值,则调用方亦可取也。
#include <stdio.h>
// “值调用”
void swap_value(int x, int y) {
int temp = x;
x = y;
y = temp;
}
// “引用调用1”,形参:传的是地址,取得是值(*)
void swap_p(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}
// “引用调用2”,形参:传的是值,接的是地址
void swap_addr(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
main() {
int x = 0;
int y = 1;
printf("x = %d, y = %d\n", x, y);
swap_value(x, y);
printf("传值调用后:x = %d, y = %d\n", x, y);
swap_p(&x, &y);
printf("传地址调用后:x = %d, y = %d\n", x, y);
swap_addr(x, y);
printf("传值接地址调用后:x = %d, y = %d\n", x, y);
}
运行结果:
x = 0, y = 1
传值调用后:x = 0, y = 1
传地址调用后:x = 1, y = 0
传值接地址调用后:x = 0, y = 1 ←(0,1)换成(1,0);这一步又还回来(0,1)
练习:返回值,返回参数
定义一个函数,要求能够同时得到一个整型数组的最大值和最小值。
#include <stdio.h>
// 返回值:最大值
// 返回参数:最小值
int max_min(int a[], int len, int *min) {
int nMax = a[0];
int nMin = a[0];
for(int i = 0; i<len ; i++) {
if (nMax < a[i]) {
nMax = a[i];
}
if (nMin > a[i]) {
nMin = a[i];
}
}
*min = nMin;
return nMax;
}
int main(int argc, char *argv[]) {
int a[]= {1,2,5,9,7};
int len = sizeof(a)/sizeof(int);
int nMax_main;
int nMin_main;
nMax_main = max_min(a, len, &nMin_main);
printf("Main : Max = %d, Min = %d\n", nMax_main, nMin_main);
return 0;
}