在理解 void* 前,复习一下C的数据类型、void的用法、指针的用法。
数据类型
void 类型
在C语言中, void也是数据类型:不确定的类型。
void虽然是数据类型,但不能用来定义一个void变量, 如:void test=10; // 编译时会报错,
void类型,有3个作用 ;
- 限定函数返回值, 如: void GetTime(shot t); // 这里的void表示:函数不能返回值
- 限定函数参数, 如:shot GetValue(void); // 这里的void表示:函数不接受参数传入
- 声明无类型指针, 如:void* pStrint; // void *可以接受任何类型的赋值
指针 类型
每一次看到指针这个简称,必须想起它的大名:指针类型,这样更容易理解。
- 指针类型,它和数组、结构体等是数据类型中的其中一个派生成员, ;
- 指针类型与其它数据类型的区别, 指针定义后在内存中占4个字节, 这4个字节存储的是某数据段的地址值, 而如int类型也占的4字节, 但存储的是直接的数据值;
- 指针的大小是4个字节,因为STM32的内存地址是32位4字节. 在win的64位系统中, 指针是占8个字节.
-
char* strTemp = “星期天有空吗,一起去玩吧?"; // strTemp 的大小是4个字节,不管所指向的数据是什么,有多大, 反正它只是负责某数据的地址。
- 指针用法
-
// 定义一个数组,在内存开辟一段空间,然后用指针指向它,方便做数据处理 char A[4096]; char* p=A; p++; // 等同于&A[1] *p++; // 等同于 A[1]+1 int Time = (int*)p; // 等同于 Time= A[4]<<24 | A[3]<<16 | A[2]<<8 | A[1] while(*p!=0) // 等同于 A[1]!=0 { ... } // 其实, 不用指针也可以完成上面的各种操作, 但用指针更简洁
void* 作为参数类型
void* 是一种无类型指针,任何类型指针都可以转为void*
,它无条件接受各种类型.
void* pTest; // 定义一个void指针
pTest++; // 错误; 因为指针还不确定知道其指向数据类型大小,对它++无法确定要加多少个字节
if(*pTest==0); // 错误;
(char*)pTest++; // 正确
if(*((int*)pTest)==0); // 正确
void*基本用于函数、接口。
典型的,如内存操作函数 memcpy和 memset,函数原型分别为:
void * memcpy(void *dest, const void *src,size_tlen);
void * memset ( void * buffer, int c, size_t num );
int TestINT[100]; // 传入int类型数据
memset ( TestINT, 0, 100*sizeof(int) ); // 将TestINT清0,
char TestChar[50]; // 传入char类型数据
memset(TestChar, 0, 50); // 将TestChar清0
void* 作为返回类型
- void 作为返回类型里,作用是限定函数不能返回任何值。
- void* 作为返回类型时, 作用是函数可以返回任何类型的值,可以是int,char, 也可以是struct;
void* SUM(char a, char b)
{
return a+b;
}
int main(void)
{
int V1 = SUM(1,2);
char V2 = SUM(1,2);
float V3 = SUM(1,2);
int* V4 = SUM(1,2);
}
特别注意
void* SUM(char A, char B); // 这里是指函数可以返回任何类型的值
void (*SUM)(char A, char B); // 这个是函数指针,和void* 是完全没一丁点关系联系的。