因为函数参数是按值传递的,所以要想改变变量,必须传递地址。
二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**。
(void**)&必须是本质上就是指针变量的地址才可以做这样的转换,并不是说把一个一级指针也可以转换,void**的本质是标识一个二级指针。
&data就是(默认数据类型 **)&data,(void **)&data和&data还是同一块内存,只不过数据类型发生变化了。
如果默认数据类型是int,&data就是(int **)&data
一级指针:
void
swap ( int *a, int *b ){
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
}
int
main ( int argc, char **argv ){
int a,b;
a = 16;
b = 32;
swap(&a, &b);
return ( a - b );
}
二级指针:
void swap(int **a, int **b)
{
int t;
t =**a;
**a =**b;
**b=t;
}
int main()
{
int i = 3;
int j = 5;
int *p = &i;
int *q = &j;
swap(&p, &q);
}
高级一点使用void**只是为了通用,可以交换各种类型。
void swap(void **a, void **b)
{
void *t;
t =*a;
*a =*b;
*b=t;
}
int main()
{
int i = 3;
int j = 5;
int *p = &i;
int *q = &j;
char *s1="abc";
char *s2="def";
swap((void**)&p, (void**)&q);
swap((void**)&s1, (void**)&s2);
}<