空指针是没有任何关联数据类型的指针。空指针可以保存任何类型的地址, 并且可以将其类型转换为任何类型。
int a = 10;
char b = 'x' ;
void *p = &
a;
//void pointer holds address of int 'a'
p = &
b;
//void pointer holds address of char '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++++中不编译。在C++++中, 我们必须将malloc的返回值显式地转换为(int *)。
2)C中的void指针用于在C中实现泛型函数。例如qsort()中使用的比较函数.
一些有趣的事实:
1)
无效指针不能被取消引用。例如, 以下程序无法编译。
#include<
stdio.h>
int main()
{
int a = 10;
void *ptr = &
a;
printf ( "%d" , *ptr);
return 0;
}
输出如下:
Compiler Error: 'void*' is not a pointer-to-object type
以下程序可以编译并正常运行。
#include<
stdio.h>
int main()
{
int a = 10;
void *ptr = &
a;
printf ( "%d" , *( int *)ptr);
return 0;
}
输出如下:
10
2)的C标准不允许使用无效指针的指针算术。但是, 在GNU C中, 考虑到void的大小为1是允许的。例如, 以下程序在gcc中编译并运行良好。
#include<
stdio.h>
int main()
{
int a[2] = {1, 2};
void *ptr = &
a;
ptr = ptr + sizeof ( 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
【C/C++中的void指针介绍和用法解析】如果发现任何不正确的地方, 或者你想分享有关上述主题的更多信息, 请发表评论
推荐阅读
- CSS阴影效果介绍和实现示例
- 如何在另一个JavaScript文件中包含一个JavaScript文件()
- Salesfoce面试体验|S2(SDE校园)
- 安装系统 笔记本usb重装系统,教您笔记本usb重装win8系统的设置
- ultraiso u盘装系统,教您ultraiso u盘装win7系统
- U盘删除文件恢复,教您怎样恢复u盘数据
- Win7下安装Win10双系统安装图文详细教程
- U盘打开盘自制工具图文详细教程,教您自制打开盘
- U盘做打开盘,教您怎样用U盘做打开盘