前言:
为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1. 简介
void 的意思是“空类型”,void * 则是“空类型指针”,void * 可以指向任何类型的数据。任何类型的指针都可以赋值给 void *,反之不成立。
1.1 void 的作用
(1)对函数返回的限定;
(2)对函数参数的限定。
1.2 void 修饰函数的返回值和参数
(1)如果函数没有返回值,应该声明为 void 类型。在 C 语言中,凡是不加返回值限定的函数,都会被编译器最为返回整型值处理。
(2)如果函数无参数,应该声明其参数为 void。
void function (void)
{
}
1.3 void 指针
(1)不能对 void 指针进行算法操作;
例如:
void *pvoid;
int *pint;
pvoid ++; //错误,ANSI不允许
pint ++; //正确
因为 ANSI 规定:进行算法操作的指针必须是确定知道其指向数据类型大小的,即必须知道内存目的地址的确切值。
注:
在 GNU 中,指定 void * 的算法操作与 char * 一致。
void *pvoid;
pvoid ++; //正确,等价于 char *pvoid
为符合 ANSI 标准,提高程序的可移植性,可如下操作:
void *pvoid;
(char *)pvoid ++;
1.3.1 void *指针使用介绍
(1)memcpy 内存拷贝函数的实现,Memcpy 函数的实现要注意目的地址和源地址存在重叠的情况,如下图:
这时在函数内部需要判断,分别对不同的情况进行处理。
void *Memcpy(void *dest, const void *src, unsigned int count)
{
char *pdest = (char *)dest;
char *psrc = (char *)src;
if (pdest == NULL || psrc == NULL)
{
return NULL;
}
if (pdest > psrc)
{
while (count--)
{
*(pdest + count) = *(psrc + count);
}
}
else
{
while (count--)
{
*pdest++ = *psrc++;
}
}
return pdest;
}
(2)memset:在一段内存块中填充某个给定的值。只能将一段内存按照字节来初始化,不可以对变量进行初始化。
void *Memset(void *dest, int n, unsigned int len)
{
if (dest == NULL)
return NULL;
char *pdest = (char *)dest;
while (len--)
{
*pdest++ = n;
}
return pdest;
}
memset 常用于数组和结构体的初始化。
注:
参数:
dest:指向要填充的内存块。
n : 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符(unsigned char——0x00~0xFF)形式。
len :要被设置为该值的字节数。
1.4 void 不能代表一个真实的值
因为定义变量时必须分配内存空间,定义 void 变量,编译器不知道该怎样分配内存空间,void 仅是一种抽象的需要。