1. 程式人生 > >C語言--void指標引數

C語言--void指標引數

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
typeint **’ 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.