参数传递
函数传递参数实际上是值传递。什么是值传递呢,举两个例子:
void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
int main(){
int a = 1,b = 2;
swap(a,b);
swap(1,2);
}
看代码中调用swap函数是不是既能传递变量a,b又可以传递1,2。你想通过swap函数去交换a,b。不就相当于去交换1,2的值嘛???what?你觉得这可能发生嘛,1还是1,2还是2不可能改变的。
所以说对于主函数传递的参数只是变量的中的内容,跟变量一毛钱关系都没有。
在子函数中的参数变量a,b只是用来接收主函数传递的值。
那么接下来看是怎么通过指针来交换值的。
void swap(int* pa, int* pb) {
int t = *pa;
*pa = *pb;
*pb = t;
}
int main(int argc, char** argv) {
int a = 1;
int b = 2;
swap(&a, &b);
printf("%d %d", a, b);
return 0;
}
还记的上面说的嘛,主函数调用子函数传递的是值,&a,&b是什么?是a,b的地址—那一串16进制字符,&的作用就是获得变量的地址。
什么变量才能装地址呢,那只能是指针变量了,在子函数中,我们用int* pa, int* pb来接受a,b的地址。
函数体里:t = *pa, 指针变量pa的值=Ox12,加上*就表示获得地址Ox12的内容。即t = 1,*pa = *pb就是让a地址中的内容等于2,同理*pb = t,就是让b地址中的内容等于1.这样就完成了交换。
指针
对于任何类型的指针可以把变量类型和*(int*)放在一起,变量名a分开来看。
int* a, double* b;
变量只是存储内容的,而指针变量的内容就是地址。 int* 类型的指针变量用来存储int型的地址,其他类型的同理。
*+指针变量名,就是取变量存放的那个地址中的值。