C的void指针

原文在此

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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值