无类型void
void用途:
- 限定函数返回值;
例如:void text()表示函数无返回值; - 限定函数的形参;
例如:int text (void)表示函数没有参数传递,返回一个int类型的数据;通常省去void,直接写成int text ()
注意:void不能像char 、 int 、double等类型那样定义变量,因为void是无类型,系统无法给void分配空间,不知道分配多大字节的空间。所以没有void类型的变量;
万能指针void *
任何类型的指针都可以直接赋值给void *类型的指针,void * 可以指向任意类型的数据,就是说可以用任意类型的指针对 void * 赋值,故称为万能指针;
- void *是一个指针类型,指针变量都占4byte内存(4byte=32 bit),所以对于void *p=NULL, 这样的定义,编译器可以为p分配内存。
void *p = NULL;
printf("size p = %d\n",sizeof(p));//打印输出4,即void*类型指针系统分配4字节
- void *类型不可直接解引用操作,因为解引用出来的是void基类型,但是系统没有这种类型的变量;
int num = 10;
void *p = #
printf("*p = %d\n",*p);//error
- void* 可以存放任意数据类型的地址,但反过来则不行,若将void *类型对其他类型赋值,需要将void * 类型进行强制类型转换;
int *p1 = NULL;
char *p2 = NULL;
void *p3 = NULL;
p3 = p1;//不需要强制类型转换,编译器不会出警告
p1 = (int *)p2;// 需要进行对应类型的强转,不然编译器会出警告,提示指针类型不匹配
p1 = (int *)p3;//若使用,需强转,转换成对应类型int *类型
- 典型应用:malloc函数
函数原型:void * malloc(size_t size);
作用:malloc 向系统申请分配指定 size 个字节的内存空间,即 malloc 函数用来从堆空间中申请指定的 size 个字节的内存大小,返回类型是 void * 类型,如果成功,就会返回指向申请分配的内存,否则返回空指针;
注意:malloc函数返回的是void * 类型,因为malloc函数只负责开辟空间,将这块内存的首地址返回给函数调用者,并不知道函数调用者要将此空间存放什么类型的数据,故返回 void * 类型。最后由函数调用者进行相应类型的强制转换;