传值
C中,所有非数组形式的数据实参均为值传递形式,值传递也就是调用函数的时候,把实参拷贝一份给调用函数,就是说函数操作的是实参的拷贝而不是实参本身。在子函数中,对传递的参数(形式参数)进行的修改不会作用于原变量。
#include <stdio.h>
void test(int x, int y);
int main() {
int a = 1, b = 2;
test(a, b);//在这里传递的就是a,b的值,接下来在子函数test()中,对x,y的操作不会影响a,b的原值
printf("%d %d", a, b);
}
void test(int x, int y) {
int tem;
tem = x;
x = y;
y = tem;
}
接下来是对变量的监视,可以看到,在执行完代码以后,x,y的值进行了互换变成了2,1,但是原值a,b仍然是1,2
传引用
引用和原变量是一个东西,只是换了一个称呼
传引用实质上就是传递了原变量的地址
地址有了以后,对变量的操作就会直接对该地之内存在的值进行修改,也就是在子函数中对变量的操作将直接作用于原变量。
#include <stdio.h>
void test(int &x, int &y);
/* 子函数的形式参数带有取址符,当调用子函数时,会直接对传递的参数进行取地址操作,
使得之后对x,y的操作直接作用于原变量 */
int main() {
int a = 1, b = 2;
test(a, b);
printf("%d %d", a, b);
}
void test(int &x, int &y) {
int tem;
tem = *x;
*x = *y;
*y = tem;
}
指针
传指针的本质是传值,但是这个值是原变量的地址。
#include <stdio.h>
void test(int *x, int *y);
int main() {
int a = 1, b = 2;
test(&a, &b);
printf("%d %d", a, b);
}
void test(int *x, int *y) {
int tem;
tem = *x;
*x = *y;
*y = tem;
}
监视器页面
可以看到x,y的值是一个二进制的数字,代表存放a和b的地址,后面的大括号指的是这个地址里面存放的值