void swap( int *x , int *y )
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
swap( &a , &b );
printf("a = %d , b = %d\n" , a , b );
return 0;
}
函数传参是值传递,所以这就是为什么要实现两个值互换要传指针也就是两个值的地址进去的原因。要互换两个地址里的值,所以要把一个值暂存起来,所以int tmp;接着解引用x,把x地址里的值赋给tmp,再把y地址里的值赋给x,tmp值赋给y的解引用。
那么要实现指针互换的话,就需要二级指针了。
结果无知的我写出了下面的代码
char *a = "123";
char *b = "456";
void swap( char *tmp1 , char *tmp2 )
{
char *str = (char *)malloc(10);
strcpy( str , tmp1 );
strcpy( tmp1 , tmp2 );
strcpy( tmp2 , str );
free(str);
}
int main()
{
printf("%s , %s\n" , a , b );
swap( a , b );
printf("%s , %s\n" , a , b );
return 0;
}
这代码有几个问题,第一是strcpy( tmp1 , tmp2 );给指向常量的指针赋值了
第二是这样是修改了值,并没有修改指针,虽然看起来现象是一致的。
所以又发现了一个坑。修改完是这样的
void swap( char *tmp1 , char *tmp2 )
{
char *str = (char *)malloc(4);
strcpy( str , tmp1 );
strcpy( tmp1 , tmp2 );
strcpy( tmp2 , str );
free(str);
}
int main()
{
char *a = (char *)malloc(4);
char *b = (char *)malloc(4);
memset(a,0x41,4);
memset(b,0x42,4);
printf("%s , %s\n" , a , b );
swap( a , b );
printf("%s , %s\n" , a , b );
return 0;
}
所以还得二级指针,对不起打扰了。
void swap( char **tmp1 , char **tmp2 )
{
int *str = (char *)malloc(4);
*str = *tmp1;
*tmp1 = *tmp2;
*tmp2 = *str;
free(str);
}
int main()
{
char *a = (char *)malloc(4);
char *b = (char *)malloc(4);
memset(a,0x41,4);
memset(b,0x42,4);
printf("%s , %s\n" , a , b );
swap( &a , &b );
printf("%s , %s\n" , a , b );
return 0;
}
这里注意为什么局部变量str是int类型?因为里边存的是地址,4字节,所以定义成int了 。理解二级指针使用的时候可以吧*tmp1看成一个整体来考虑,不考虑tmp1本身还是个指针这一点。反正我比原来理解多了。哈哈哈,感觉没说明白