这篇文章主要为大家详细介绍了C语言的void*空指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
在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语言的void*空指针
基础教程推荐
- 05-C语言进阶——动态内存管理 2023-11-20
- Qt数据库应用之实现通用数据库请求 2023-03-18
- 利用QT设计秒表功能 2023-05-30
- g++: const 丢弃限定符 2022-10-07
- 纯C++代码详解二叉树相关操作 2023-05-15
- C语言数组长度的计算方法实例总结(sizeof与strlen) 2023-04-26
- character-encoding – Linux中最常见的C语言编码(和Unix?) 2023-11-21
- C语言植物大战数据结构二叉树递归 2023-04-09
- VisualStudio2010安装教程 2023-01-05
- C语言的三种条件判断语句你都了解吗 2023-03-05
