在C语言中,void
称为无类型,相应的void*
称为无类型指针或者空指针类型。
void的应用
对函数返回值的限定。
例如void func(int);
该函数没有返回值。对函数参数类型的限定。
例如int func(void);
该函数没有参数,不允许接收参数。
空指针类型(void*)
空指针类型的变量void* pvoid;
可以指向任意类型的数据,任何类型的指针也可以直接赋值给空指针类型的变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#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
*/
但是如果空指针类型的变量赋值给任意指针类型的变量,就需要强制转换;也就是显式说明该指针指向的内存中是存放的什么类型的数据。
1
2
3
4
5
6
7
8
|
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)
。
1
2
3
4
5
6
7
|
int i; void *pvoid; pvoid = &i; printf ( "%p\n" , pvoid); pvoid++; //ANSI:错误;GNU:正确 pvoid += 1; //ANSI:错误;GNU:正确 printf ( "%p\n" , pvoid); |
在实际的程序设计中,为迎合 ANSI 标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:
1
2
|
(( int *)pvoid)++; ( int *)pvoid += 1; |
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/qq_45607873/article/details/123794870