C语言–函数的传参(pointer)
c语言中有一种通用指针,void * 类型指针,该指针在C中很常见,通常用于针对不同类型参数的函数。
例如,以下函数将对任何类型的数据清零。
void test(void *data, size_t n)
{
memset(data, 0x00, n);
}
可以将任何类型的指针传递给test函数而不需要cast。
int ax = 10;
test(&ax, sizeof(ax));
printf("ax = %d\n", ax);
void *ptr = &ax;
return 0;
但是, void** 是另一种情况。
void changeptr(void **ptr)
{
*ptr = NULL;
}
int ax = 10;
void *ptr = &ax;
int *iptr = ptr;
printf("%d\n", *iptr);
test(&ax, sizeof(ax));
changeptr(&iptr);
printf("ax = %d\n", ax);
return 0;
warning: incompatible pointer types pass 'int **' to parameter of type 'void **'
gcc testvoid.c -o testvoid
testvoid.c: In function ‘main’:
testvoid.c:19:15: warning: passing argument 1 of ‘changeptr’ from incompatible pointer type [-Wincompatible-pointer-types]
changeptr(&iptr);
^
testvoid.c:10:6: note: expected ‘void **’ but argument is of type ‘int **’
void changeptr(void **ptr)
因此,对于void ** 参数必须进行强制类型转换
changeptr((void **)&iptr);
A cast is necessary here because, although a void pointer is compatible with any other type of pointer in C, a pointer to a void pointer is not.