欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

详解C语言的void*空指针

时间:2022-11-28 10:29:52|栏目:C代码|点击:

在C语言中,void称为无类型,相应的void*称为无类型指针或者空指针类型。

void的应用

对函数返回值的限定。

例如void func(int);该函数没有返回值。对函数参数类型的限定。

例如int func(void);该函数没有参数,不允许接收参数。

空指针类型(void*)

空指针类型的变量void* pvoid;可以指向任意类型的数据,任何类型的指针也可以直接赋值给空指针类型的变量。

#include <stdio.h>


int main()
{
    char c, *pc;
    int i, *pi;
    double d, *pd;
    void *pvoid;

    pc = &c;
    pvoid = pc;
    printf("pvoid = %p  &c = %p\n", pvoid, &c);
    pi = &i;
    pvoid = pi;
    printf("pvoid = %p  &i = %p\n", pvoid, &i);
    pd = &d;
    pvoid = pd;
    printf("pvoid = %p  &d = %p\n", pvoid, &d);

}


/*
输出结果
pvoid = 000000000061FDFF  &c = 000000000061FDFF
pvoid = 000000000061FDF8  &i = 000000000061FDF8
pvoid = 000000000061FDF0  &d = 000000000061FDF0
*/

但是如果空指针类型的变量赋值给任意指针类型的变量,就需要强制转换;也就是显式说明该指针指向的内存中是存放的什么类型的数据。

void *pvoid;
int *pi;
char *pc;
double *pd;

pi = (int*)pvoid;
pc = (char*)pvoid;
pd = (double*)pd;

另外,以下有些需要注意的地方。

在 ANSI C 标准中,不允许对 void 指针进行一些算术运算如 p++ 或 p+=1 等。因为既然 void 是无类型,那么每次算术运算我们就不知道该操作几个字节,例如 char 型操作 sizeof(char) 字节,而 int 则要操作 sizeof(int) 字节。而在 GNU 中则允许,因为在默认情况下,GNU 认为 void * 和 char * 一样,既然是确定的,当然可以进行一些算术操作,在这里sizeof(*p)==sizeof(char)

int i;
void *pvoid;
pvoid = &i;
printf("%p\n", pvoid);
pvoid++;//ANSI:错误;GNU:正确
pvoid += 1;//ANSI:错误;GNU:正确
printf("%p\n", pvoid);

在实际的程序设计中,为迎合 ANSI 标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:

((int*)pvoid)++;
(int*)pvoid += 1;

总结

 

上一篇:C++中的命名空间详细介绍

栏    目:C代码

下一篇:没有了

本文标题:详解C语言的void*空指针

本文地址:http://www.codeinn.net/misctech/220124.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有