📜  C / C++中的void指针

📅  最后修改于: 2021-05-26 03:40:52             🧑  作者: Mango

空指针是没有任何关联数据类型的指针。空指针可以保存任何类型的地址,并且可以将其类型转换为任何类型。

int a = 10;
char b = 'x';
  
void *p = &a;  // void pointer holds address of int 'a'
p = &b; // void pointer holds address of char 'b'

void指针的优点:
1) malloc()和calloc()返回void *类型,这允许这些函数用于分配任何数据类型的内存(仅由于void *)

int main(void)
{
    // Note that malloc() returns void * which can be 
    // typecasted to any type like int *, char *, ..
    int *x = malloc(sizeof(int) * n);
}

请注意,上面的程序在C中编译,但在C++中不编译。在C++中,我们必须将malloc的返回值显式地转换为(int *)。

2) C中的void指针用于在C中实现泛型函数。例如qsort()中使用的compare函数。

一些有趣的事实:
1)无效指针不能被取消引用。例如,以下程序无法编译。

#include
int main()
{
    int a = 10;
    void *ptr = &a;
    printf("%d", *ptr);
    return 0;
}

输出:

Compiler Error: 'void*' is not a pointer-to-object type 

以下程序可以编译并正常运行。

#include
int main()
{
    int a = 10;
    void *ptr = &a;
    printf("%d", *(int *)ptr);
    return 0;
}

输出:

10

2) C标准不允许使用带空指针的指针算术。但是,在GNU C中,考虑到void的大小为1是允许的。例如,以下程序在gcc中编译并运行良好。

#include
int main()
{
    int a[2] = {1, 2};
    void *ptr = &a;
    ptr = ptr + sizeof(int);
    printf("%d", *(int *)ptr);
    return 0;
}

输出:

2

请注意,以上程序可能无法在其他编译器中运行。

参考:
http://stackoverflow.com/questions/20967868/should-the-compiler-warn-on-pointer-arithmetic-with-a-void-pointer
http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。