传值
void main(){
printf("Hello World!\n");
int a = 3;
int b = 4;
printf("bef swap, add of a = %d\n",&a);
printf("aft swap, val of a = %d\n",a);
swap(a,b);
printf("aft swap, add of a = %d\n",&a);
printf("aft swap, val of a = %d\n",a);
}
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
先看这段代码,swap这个函数作用是交换ab的值。
首先,在进行处理之前,实参a会把值传给形参a,实参a的地址还是1638212,函数里面的操作都是对形参a的操作,例如,形参a的地址为123,那么就是对地址123来进行赋值操作。对实参a没有影响。
传地址
int* a; int* b; 这是两个指针变量。指针是一种特殊的数据类型。举个例子,int n = 1; int *a = &n; 那么a就是一个指针变量,他的值就是变量n的地址,*a的值就是n地址下存放的值,也就是1。
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
结果
这里我们的函数直接传进来的是指针,直接对地址进行赋值和取值操作,也就是说,存放3和4的地址变了,但是指针a所指向的地址还是指向之前未交换之前3的地址。
引用
引用就是变量的一个别名,其实对引用的操作就是对原对象的操作,可以简单地理解为,传递进去的就是实参本身。
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
结果:
这里是直接对a和b进行操作的,同时,只是改变了a和b所对应地址里面的值,但是没有改变a和b的地址。
举个例子
void main(){
printf("Hello World!\n");
int a = 3;
int b = 4;
int* c = &a;//c是指向a的指针
int& d = b;//d是b的引用,alias of b = d
printf("val of a = %d\n",a);
printf("add of a = %d\n",&a);
printf("val of c = %d\n",c);
printf("add of c = %d\n",&c);
printf("val of b = %d\n",b);
printf("add of b = %d\n",&b);
printf("val of d = %d\n",d);
printf("add of d = %d\n",&d);
}
结果:
可以看到,指针c是有自己的地址的,而且c的值是a的地址,*c就代表指向a地址的值。那么d其实就是变量b的引用,实际上对d的操作就是在对b来进行操作。自然d的地址就是b的地址,d的值就是b的值。
其实,在更加复杂的函数中,如果想对函数的参数进行操作,但是又需要返回多个参数值时,可以将参数设置为引用,这样函数方法里面对参数的操作都会被保留带出函数体。
身边没电脑,例子都是百度上面的,也比较简单,之前对这块理解的不是很透彻。
可能有理解不对的地方,欢迎大佬们指正。