经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
详解C语言的void*空指针
来源:jb51  时间:2022/3/29 11:46:50  对本文有异议

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

void的应用

对函数返回值的限定。

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

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

空指针类型(void*)

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

  1. #include <stdio.h>
  2.  
  3.  
  4. int main()
  5. {
  6. char c, *pc;
  7. int i, *pi;
  8. double d, *pd;
  9. void *pvoid;
  10.  
  11. pc = &c;
  12. pvoid = pc;
  13. printf("pvoid = %p &c = %p\n", pvoid, &c);
  14. pi = &i;
  15. pvoid = pi;
  16. printf("pvoid = %p &i = %p\n", pvoid, &i);
  17. pd = &d;
  18. pvoid = pd;
  19. printf("pvoid = %p &d = %p\n", pvoid, &d);
  20.  
  21. }
  22.  
  23.  

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

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

  1. void *pvoid;
  2. int *pi;
  3. char *pc;
  4. double *pd;
  5.  
  6. pi = (int*)pvoid;
  7. pc = (char*)pvoid;
  8. pd = (double*)pd;

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

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

  1. int i;
  2. void *pvoid;
  3. pvoid = &i;
  4. printf("%p\n", pvoid);
  5. pvoid++;//ANSI:错误;GNU:正确
  6. pvoid += 1;//ANSI:错误;GNU:正确
  7. printf("%p\n", pvoid);

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

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号