C语言中,*类型就是指针类型,比如 int *p,double q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不同;
| 基本认识
- void可以指向任何类型的地址,但是带类型的指针不能指向void的地址
- void*指针只有强制类型转换以后才可以正常取值
- void*指针变量和普通指针一样可以通过等于0或者NULL来初始化,表示一个空指针
- 当void*指针作为函数的输入和输出时,表示可以接受任意类型的输入指针和输出任意类型的指针
#include "stdio.h"
void *test(void *buff)
{
return buff;
}
int main()
{
int nums[] = {3, 5, 6, 7, 9};
// 初始化指针
void *p1 = NULL;
p1 = nums;
// 打印地址
printf("%d\\n", p1);
// 取值(报错)
// printf("%d\\n", *p1);
// 取值(正常)
printf("%d\\n", *(int *)p1);
// 地址偏移(警告)
// printf("%d\\n", ++p1);
// 地址偏移(正常)
int *p2 = (int *)p1;
printf("%d\\n", p2++);
}
| 典型应用
void*类型的指针其实本质就是一个过渡型的指针状态,在编写框架的时候就可以在不确定输入的时候使用,典型的应用有两种:
函数传参时不确定类型,或者要支持多类型的传参
void function(int dataType, void* data) {
// 根据dataType的不同值,进行不同的转换
switch (dataType) {
case 0:
int* a = (int*)data;
case 1:
char* a = (char*)data;
...
}
}
当函数的返回值不考虑类型指关心大小的时候
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
| 函数指针
各位第一眼看到下边的函数有什么想法,是不是有种熟悉又陌生的感觉:
typedef void (*fun)(void *data1);
看看下面的用法:
#include "stdio.h"
// 定义一个函数类型
typedef void (*fun)(void *data1);
// 实例一个函数变量
fun test;
// 定义一个回调函数
void callBack(void *p1)
{
printf("%d\\n", *(int *)p1);
}
int main()
{
int a = 10;
test = callBack;
test(&a);
}
--END--
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
C语言
+关注
关注
180文章
7597浏览量
136117 -
指针
+关注
关注
1文章
479浏览量
70506 -
sizeof
+关注
关注
0文章
9浏览量
6435
发布评论请先 登录
相关推荐
C语言中void指针的基本认识及典型应用
C语言中,*类型就是指针类型,比如 int *p,double *q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型*类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不
发表于 02-01 09:26
•1056次阅读
请问如何传入void *指针给dll函数
Labview新手,要调用dll中的一个函数,它接收一个void *指针,然后把地址传出来。我接着要用这个地址传给它的另外一个函数。c语言的调用是这样的。void *ptr.A(&ptr);B(ptr);请问labview该如何
发表于 05-02 13:57
IAR和Keil中void *指针编译提示错误
void *p;int FuncInt(int x,int y){return 1;}int main(void){p = FuncInt;}上面这段代码在Keil里面没有错误和警告,在IAR里面
发表于 12-29 09:42
【设计技巧】指针的使用注意事项:空指针、指针赋值、void *指针
的类型多么复杂,比如一个特别大的结构体,它的指针和一个 char型指针的大小本质上是一样的,因为指针就是起始地址。 正式由于这个原因,(void )型
发表于 08-20 08:30
谈谈void指针的一些妙用
关注+星标公众号,不错过精彩内容转自 | 嵌入式客栈要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ...
发表于 01-26 07:20
什么是void指针?void指针有何功能
[导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1什么是void指针
发表于 02-21 06:01
C语言void及void指针深层探索
1.概述 本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.void的含义
发表于 09-21 11:36
•166次下载
深入了解void指针背后的机理
当使用关键字void声明指针变量时,它将成为通用指针变量。任何数据类型(char,int,float等)的任何变量的地址都可以赋值给void指针
发表于 05-06 09:49
•1339次阅读
浅谈void 型指针的高阶用法
要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1 什么是void指针
STM32编程:void指针高阶用法举例,设计一个通用掉电存储子系统
[导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1什么是void指针
发表于 12-27 18:47
•10次下载
STM32编程:void指针高阶用法
[导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR fo...
发表于 02-07 11:14
•2次下载
一文揭秘C语言的void指针
void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。
评论