【C语言补漏】 void指针和NULL指针

void:无类型。

在定义变量时,变量的类型决定占用的内存大小;

直接定义无类型的变量,编译器是不能他通过的。如下。

void a;

编译器报错

void指针

void指针我们称之为通用指针,也就是可以指向任意类型的数据。也就是说,任何类型的指针都可以赋值给void指针。

测试一下:

#include <stdio.h>

int main()
{
	int num = 1024;
	int *pi = &num;
	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 = &num;
	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

猜你喜欢

转载自blog.csdn.net/plSong_CSDN/article/details/85334650
今日推荐