一、交换两数据值的错误做法
错误一:
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int x=1;
int y=2;
swap(x,y);
}
错误原因:
主函数调用swap函数时,swap函数会分配a,b两个空间来存储主函数的参数,swap函数执行完后
swap中分配的栈空间中a,b两个值交换了。但是当swap函数执行完返回主函数时,a,b两个变量被释放,而主函数中的x,y并么有改变。
错误二:
void swap(int* a, int* b)
{
int* temp = a;
a = b;
b = temp;
}
int main()
{
int x=1;
int y=2;
swap(&x,&y);
}
错误原因:
转函数调用swap函数时,swap函数分配两个指针变量a,b来存储x,y的地址,swap函数运行后,交换的是两个指针变量的地址,a指向y,b指向x,在swap函数返回主函数后,a,b两个指针变量被释放,主函数的x,y仍然没有被改变。
二、交换两变量值得正确做法
交换常量值:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x=1;
int y=2;
swap(&x,&y);
}
主函数调用swap函数时,swap函数分配两个指针变量a,b分别指向x,y,swap函数通过*p直接访问指针所指向的值,并将他们交换,当swap函数返回主函数后a,b两个指针变量被释放,但是他们指向的x,y被改变了。
交换指针变量值:
void swap(int** c, int** d)
{
int* temp = *c;
*c = *d;
*d = temp;
}
int main()
{
int x = 1;
int y = 2;
int* a = &x;
int* b = &y;
swap(&a, &b);
}
主函数调用swap函数时,swap函数中分配两个指针变量c,d分别指向主函数中的指针变量a,b,执行swap函数时,通过c,d两个指针变量来操作a,b两个指针变量,达到交换两个指针变量的目的。只会改变指针变量a,b中存储的地址,不会改变常量x,y的值。
void swap(int* c, int* d)
{
int temp = *c;
*c = *d;
*d = temp;
}
int main()
{
int x = 1;
int y = 2;
int* a = &x;
int* b = &y;
swap(a, b);
}
主函数调用swap函数时,分配两个指针变量c,d来存储指针变量a,b的值,也就是c,d直接指向变量值,通过*P来交换变量值,所以最后变量x,y会改变,而a,b中存储的地址不会改变。
总结
子函数要对主函数的变量进行操作,子函数中的传入参数要为主函数变量的地址,如主函数为普通变量,则传入参数要为指针,如主函数为指针变量,传入参数要为二级指针,依次内推。然后子函数中通过该指针来改变主函数的变量的值,不要再子函数中直接操作指针,而要通过*p来操作指向的变量。最后一种情况与交换常量值相似,都是改变常量的值,而不会改变主函数指向常量的指针。