void:无类型。
在定义变量时,变量的类型决定占用的内存大小;
直接定义无类型的变量,编译器是不能他通过的。如下。
void a;
编译器报错
void指针
void指针我们称之为通用指针,也就是可以指向任意类型的数据。也就是说,任何类型的指针都可以赋值给void指针。
测试一下:
#include <stdio.h>
int main()
{
int num = 1024;
int *pi = #
char *ps = "ILOVEYOU";
void *pv;
pv = pi;
printf("pv: %p,pi: %p,&num: %p\n", pi, pv, &num);
pv = ps;
printf("pv: %p,ps: %p \n", pv, ps);
}
运行结果:
pv: 000000DF7CDFF654,pi: 000000DF7CDFF654,&num: 000000DF7CDFF654
pv: 00007FF7E4E19CA8,ps: 00007FF7E4E19CA8
请按任意键继续. . .
可以看出,任何类型的指针转换为void类型的指针,是行的;
但是,不能直接对void指针就行解引用。使用之前需要转换指针的类型。
如下:
#include <stdio.h>
int main()
{
int num = 1024;
int *pi = #
char *ps = "ILOVEYOU";
void *pv;
pv = pi;
printf("pv: %p,pi: %p,&num: %p\n", pi, pv, &num);
printf("num: %d,*pi: %d,*(int *)pv: %d\n", num,*pi, *(int *)pv);//(int *)强制指针类型转换
pv = ps;
printf("pv: %p,ps: %p \n", pv, ps);
printf("(char*)pv: %s,ps: %s\n", (char*)pv, ps);//看注
}
运行结果:
pv: 000000EED8DCF904,pi: 000000EED8DCF904,&num: 000000EED8DCF904
num: 1024,*pi: 1024,*(int *)pv: 1024
pv: 00007FF7095F9CA8,ps: 00007FF7095F9CA8
(char*)pv: ILOVEYOU,ps: ILOVEYOU
请按任意键继续. . .
(注:字符串在C语言中有一个特殊的约定,只需要指向字符串的起始地址,然后一个字节一个自己读取,直到读到'\0')
NULL指针
NULL就是空指针,表示指向一个不被使用的地址。
#define NULL ((void *)0)
空指针:当编程时,还不清楚要将指针初始化为什么地址,请将它初始化为NULL; 在指针进行“解引用”时,先检查该该指针是否为NULL。这种策略可以为你今后编写大型程序节省大量的调试时间。
★finished by songpl,2018.12.29