1、void 修饰函数代表没有参数和没有返回值
2、void不是实际的类型,而是一种抽象的类型。不能用void定义变量,但是可以用void 定义指针,因为指针都是固定4字节。
比如:
void a; //error
void p[5]; //error
void *p; //正确
3、void 指针的意义
- C语言规定只有相同类型的指针才能相互赋值
- void* 类型的指针作为左值使用可以接受任意类型的指针
- void* 类型的指针作为右值使用需要进行强制类型转换。(malloc函数)
#include <stdio.h>
void Memset(void* src, int length, int n)
{
unsigned char* p = (unsigned char*)src;
int i = 0;
for (i = 0; i < length; i++)
{
p[i] = n;
}
}
int main()
{
int a[5];
printf("sizeof(a) = %d\n", sizeof(a)); //20
int i = 0;
Memset(a, sizeof(a), 0);
for (i = 0; i < 5; i++)
{
printf("a[%d] = %d\n", i,a[i]);
}
return 0;
}
Memset函数的意思就是把内存中的每一个字节都设置为一个固定的数,所以Memset函数里面的void*
要强制类型转换为char*
。
出现的疑问:char 类型的指针指向 int 类型的数组合法吗,我这个函数的意思是不是用char类型的指针指向int类型的数组?
结果:你这里并没有指向数组的指针,如int a[5];当你使用a时,常常(除了和sizeof连用以及和&连用)a会转换为指向数组首元素的指针,因为首元素类型是int,所以a常常退化为指向int的指针。而1个int占据 了连续的4个字节的空间,比如占据100,101,102,103号地址空间。这些地址中的最小值称为该int的地址。你现在用一个char* p指向其中的100号单元。就只能修改100号单元这1个字节里面的值。而++怕也只会让p指向101号地址的1个字节。
也就是说我这里的p只是指向数组第一个字节的地址,所以p就没有指向这个数组。
int a[5];
int (*p)[5] = &a; //这个才是指向数组a的指针