C语言--无类型指针void*的学习与使用
2017-09-30 17:24
393 查看
void *vp;
void*是一种特别的指针,因为它没有指向的类型,或者说不能根据这个类型判断出指向对象的长度。
void *指针具有以下特点:
1、任何指针(包括函数指针)都可以赋值给void指针;
type *p;
vp=p; //不需转换,只获得变量/对象地址而不获得大小
2. void指针赋值给其他类型的指针时都要进行转换;
type *
p=(type *)vp; //转换类型也就是获得指向变量/对象大小
3. void指针在强制转换成具体类型前,不能解引用;
*vp //错误 (因为void指针只知道指向变量/对象的起始地址,而不知道指向变量/对象的大小(占几个字节)所以无法正确引用 )
4. void指针不能参与指针运算,除非进行转换。
(type*)vp++; //等价于:vp=vp+sizeof(type)
void*的作用
1、传参:通用类型
可以作为函数模板,链表等参数的通用参数。在使用时,只需要强制类型转换就可以。
例如内存操作函数memcpy和memset的函数原型分别为:
这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,
因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。
2、强制类型转换
有时候由于重载等的干扰,导致需要转换成void *,来进行取地址。
例如,(void *)obj.member,就可以取到member的地址;直接&(obj.member)取到的实际上是obj的开始地址。
3、指向0的地址
(void *)0,指向全是0的地址,相当于NULL。
简单的小例子:
下面是无类型指针,访问是一个字节一个字节的访问的。
输出
下面创建一个整型数据类型,在访问时将输出4,即整型的数据长度来访问。
输出
空指针并赋值
输出
void *vp;
void*是一种特别的指针,因为它没有指向的类型,或者说不能根据这个类型判断出指向对象的长度。
void *指针具有以下特点:
1、任何指针(包括函数指针)都可以赋值给void指针;
type *p;
vp=p; //不需转换,只获得变量/对象地址而不获得大小
2. void指针赋值给其他类型的指针时都要进行转换;
type *
p=(type *)vp; //转换类型也就是获得指向变量/对象大小
3. void指针在强制转换成具体类型前,不能解引用;
*vp //错误 (因为void指针只知道指向变量/对象的起始地址,而不知道指向变量/对象的大小(占几个字节)所以无法正确引用 )
4. void指针不能参与指针运算,除非进行转换。
(type*)vp++; //等价于:vp=vp+sizeof(type)
void*的作用
1、传参:通用类型
可以作为函数模板,链表等参数的通用参数。在使用时,只需要强制类型转换就可以。
例如内存操作函数memcpy和memset的函数原型分别为:
void* memcpy(void *dest, constvoid *src, size_t len); void* memset(void *buffer, int c, size_t num);
这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,
因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。
2、强制类型转换
有时候由于重载等的干扰,导致需要转换成void *,来进行取地址。
例如,(void *)obj.member,就可以取到member的地址;直接&(obj.member)取到的实际上是obj的开始地址。
3、指向0的地址
(void *)0,指向全是0的地址,相当于NULL。
简单的小例子:
#include <stdio.h> int main(){ void *data = "Hello World";//一个无类型指针代替所有的类型,这里是存储字符型数据 printf("%s\n",data);//将其输出 return 0; }
下面是无类型指针,访问是一个字节一个字节的访问的。
#include <stdio.h> #include <stdlib.h> int main(){ void *data = malloc(8);//一个无类型指针代替所有的类型 printf adf2 ("%ld\n",sizeof(data[0]));//没有创建具体的数据类型,访问的时候是一个字节一个字节访问的。 free(data);//记得释放内存 return 0; }
输出
1
下面创建一个整型数据类型,在访问时将输出4,即整型的数据长度来访问。
#include <stdio.h> #include <stdlib.h> int main(){ void *data = malloc(8);//一个无类型指针代替所有的类型 int *intData = data;//为其指定一个整型的数据类型 printf("%ld\n",sizeof(intData[0]));//输出其数据尺寸 free(data);//记得释放内存 return 0; }
输出
4[/code]
空指针并赋值
#include <stdio.h> #include <stdlib.h> int main(){ void *data = malloc(8);//一个无类型指针代替所有的类型 int *intData = data;//为其指定数据类型 intData[0] = 10000; printf("%d\n",intData[0]);//输出其值 free(data);//记得释放内存 return 0; }
输出
10000
相关文章推荐
- C语言学习8:malloc返回的void*类型指针不可以做更改,free双重释放,二维数组的初始化和打印,a和a[0]和a[0][0]的区别,数组指针(*p)[3],指针数组*a[10],动态内存分配版约瑟夫环,动态分配版去空格和逗号处理,二级指针与二维数组互用
- 无类型指针void*的学习与使用
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- C语言学习2:sizeof ,数据类型,scanf,算式操作,赋值与比较操作,逻辑操作,位的操作,条件运算符,特异赋值结果,强制转换,使用变量要注意的
- 黑马程序员——C语言中指针与其他数据类型的结合使用
- C语言学习笔记--------伊能C语言学习笔记----使用指针来解决函数的副本机制
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- what's in string? c语言string类函数实现汇总 觉得都是学习使用指针的好例子(算是读书摘抄和笔记吧)
- 详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法
- 学习笔记-有关C语言的指针的类型和本质
- 使用python向C语言的链接库传递数组、结构体、指针类型的数据
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- C语言中的void 和void 指针类型
- C语言学习笔记-----伊能C语言学习笔记---指针类型和指针所指向的类型不同时
- C语言之void类型及void指针
- C语言中 sizeof 操作符使用时的一些细节 和 指针类型的大小
- 学习心得:C语言,在形参中的引用类型,使用GCC编译不通过的两种办法
- C语言之void类型及void指针 分类: C/C++ 2015-07-13 11:24 8人阅读 评论(0) 收藏
- Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法