C的void指针
来源:互联网 发布:二手手机市场软件 编辑:程序博客网 时间:2024/06/05 16:40
原文在此。
void指针,是没有指定数据类型的指针。void指针可以容纳任何类型的指针,并且可以转换到任何类型。
int a = 10;char b = 'x';void *p = &a; // void pointer holds address of int 'a' ---void指针保存整数'a'的地址p = &b; // void pointer holds address of char 'b' ---void指针保存字符'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++中,我们要做显式的类型转换,把返回值强制为 int* 。
2)用来在C中实现通用函数。如 qsort()使用的比较函数。
举一些例子:
(1)void指针不能被解引用。如下面的程序不能编译通过:
#include<stdio.h>int main(){ int a = 10; void *ptr = &a; printf("%d", *ptr); return 0;}
输出:
编译错误:'void *'不是对象指针类型
做指针类型转换后,可以很好的运行。
#include<stdio.h>int main(){ int a = 10; void *ptr = &a; printf("%d", *(int *)ptr); return 0;}
输出:
10
(2)C标准不允许使用void指针做数学运算。但是,在GNU C中是允许的,它将void的尺寸认作1 。如下面的程序在GCC中可以编译且运行。
#include<stdio.h>int main(){ int a[2] = {1, 2}; void *ptr = &a; ptr = ptr + sizeof(int); ---修改了ptr的地址,位移增加1个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
阅读全文
1 0
- C的void指针
- 【c/c++】void指针
- Void类型的指针-C语言
- C语言的void*指针使用
- C++Void*指针总结!
- C++-指针与void*指针
- c/c++void及void指针类型
- void指针(void *的用法)
- void指针(void *的用法)
- void指针(void *的用法)
- void指针(void *的用法)
- void指针(void *的用法)
- void指针(void *的用法)
- void指针(void *的用法)
- C/C++语言void及void指针
- void及void指针(C/C++语言)
- C语言void及void指针
- C/C++ void及void指针
- MAC OS 伪分布式Apache Hadoop及HBase Hive Zookeeper Flume Mahout Spark2 配置
- 如果让我重新读一次研究生——王汎森院士(台湾)
- Oracle之通过命令提示符(cmd.exe)连接 Oracle 数据库-yellowcong
- MYSQL: Parameter index out of range
- HBase入门教程
- C的void指针
- 基于EChart的地图选择器
- 如何给使用 i 标签放图标 文字类型图标
- Mysql修改大小写敏感
- Transcad v6.0免费版下载
- [初学笔记] matlab中日期的显示
- 205. Isomorphic Strings
- C++继承
- 进程与线程的一个简单解释