C語言--void指標引數
阿新 • • 發佈:2019-01-22
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.