函数参数传递的问题只需记信一点:传递的永远是参数的副本
例1:
void change(int a,int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a=10,b=20;
printf("a=%d,b=%d\n",a,b);
change(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
![](https://img-my.csdn.net/uploads/201304/10/1365524913_2801.png)
change函数中传入的是a,b的副本a',b',改变的是a',b',而a和b并没有改变
--------------------------------------------------------------------------------------------------
例2:
void change(int* a,int *b)
{
int *temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a=10,b=20;
printf("a=%d,b=%d\n",a,b);
change(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
![](https://img-my.csdn.net/uploads/201304/10/1365524921_4081.png)
change函数中传入的是指针a和指针b的副本,函数改变是指针a和指针b的副本,指针a和指针b是没有变的
------------------------------------------------------------------------------------------------
例3:
void change(int* a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a=10,b=20;
printf("a=%d,b=%d\n",a,b);
change(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
![](https://img-my.csdn.net/uploads/201304/10/1365524931_4972.png)
例3中虽然change函数中传入的也是指针a和指针b的副本,但是在函数中通过指针副本改变了其所指向数据的值。
--------------------------------------------------------------------------------------------------
例4:
struct Node
{
int x;
int y;
};
void change(Node* a,Node* b)
{
a->x = 100;
a->y = 100;
b = a;
}
int main()
{
Node a,b;
a.x = 10;
a.y = 10;
b.x = 0;
b.y = 0;
printf("a.x=%d,a.y=%d\n",a.x,a.y);
printf("b.x=%d,b.y=%d\n",b.x,b.y);
change(&a,&b);
printf("a.x=%d,a.y=%d\n",a.x,a.y);
printf("b.x=%d,b.y=%d\n",b.x,b.y);
}
![](https://img-my.csdn.net/uploads/201304/10/1365524936_4160.png)
例4中change函数传入的是结构体指针a和结构体指针b后副本,但是change函数中通过对结构体指针a的副本所指向的内容做了修改,即实际的数据被修改了。而对于结构本b,在change函数的发生的是结构体指针a的副本赋值给了结构体指针b的副本,实际上结构体指针b并没有发生改变,因此最后结构体b的输出没有发生变化。