C的void指针

来源:互联网 发布:二手手机市场软件 编辑:程序博客网 时间:2024/06/05 16:40

原文在此。

void指针,是没有指定数据类型的指针。void指针可以容纳任何类型的指针,并且可以转换到任何类型。

int a = 10;char b = 'x';void *p = &a;  // void pointer holds address of int 'a' ---void指针保存整数'a'的地址p = &b; // void pointer holds address of char 'b'  ---void指针保存字符'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++中,我们要做显式的类型转换,把返回值强制为 int* 。

2)用来在C中实现通用函数。如 qsort()使用的比较函数。

举一些例子:

(1)void指针不能被解引用。如下面的程序不能编译通过:

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

输出:

编译错误:'void *'不是对象指针类型


做指针类型转换后,可以很好的运行。

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

输出:

10


(2)C标准不允许使用void指针做数学运算。但是,在GNU C中是允许的,它将void的尺寸认作1 。如下面的程序在GCC中可以编译且运行。

#include<stdio.h>int main(){    int a[2] = {1, 2};    void *ptr = &a;    ptr = ptr + sizeof(int); ---修改了ptr的地址,位移增加1个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



原创粉丝点击