c语言野指针int*p、空指针int*p = NULL、万能指针void* p

1、野指针,既没有初始化的指针,//如果没有给指针初始化,则指针p的内容为随机地址,会随机指向,故成为野指针,不可以操作野指针

#include "stdio.h"
#include 

int main()
{
	//1、野指针,即没有初始化的指针
	//int a = 0;
	int* p ;//没有给指针初始化,则指针p的内容为随机地址,会随机指向
    //指针的初始化必须是系统分配的内存,不能自己手写赋值0x010203040,这种内存地址不安全
	*p = 200;
	printf("p:%d\n",*p);
	return 0;
}

c语言野指针int*p、空指针int*p = NULL、万能指针void* p_第1张图片

 未初始化,指针会随机指向

c语言野指针int*p、空指针int*p = NULL、万能指针void* p_第2张图片

初始化,指向系统分配的内存地址

 c语言野指针int*p、空指针int*p = NULL、万能指针void* p_第3张图片

2、空指针:将指针的值为0,即0x00000000 = NULL(大写),指针使用完毕要养成置空的习惯,判断指针是否为NULL,判断是否被使用

#include "stdio.h"
#include 

int main()
{
	//1、野指针,即没有初始化的指针
	//int a = 0;
	//int* p ;//没有给指针初始化,则指针p的内容为随机地址,会随机指向
	//*p = 200;
	//printf("p:%d\n",*p);


	//2、空指针:将指针的值为0,即0x00000000 = NULL(大写)
	//	 指针使用完毕要养成置空的习惯,判断指针是否为NULL,判断是否被使用
	int a;
	int* p = NULL;//作为一个标记,即p已经有所指向,防止p的内容为随机值
	if (*p == NULL) {
		*p = &a;
	}
	
	*p = 200;//err,因为p保存了0x00000000的地址,这个地址是不可以使用的,非法使用
	printf("%d\n",*p);
	return 0;
}

3、万能指针:可以保存所有类型的指针,但是由于类型为void *故使用时需要转成对应的类型

#include "stdio.h"
#include 

int main()
{

	//3、万能指针:可以保存所有类型的指针
	int a = 10;
	void* p = (void *)&a;
	printf("%d\n", *p);//编译失败,非法的间接寻址,指针变量p保存的地址类型为void*类型,
	//但是*p的内容为&a的地址值即指向变量a,但是由于类型是void *,故编译器不知道取几个字节,编译不通过
	system("pause");
	return 0;
}

 c语言野指针int*p、空指针int*p = NULL、万能指针void* p_第4张图片

 万能指针可以通过类型p转成具体的类型,编译器就知道取值的长度了,之争取值(1、起始地址2取值的长度)

#include "stdio.h"
#include 

int main()
{

	//3、万能指针:可以保存所有类型的指针
	int a = 10;
	void* p = (void *)&a;
	//printf("%d\n", *p);//编译失败,非法的间接寻址,指针变量p保存的地址类型为void*类型,
	//但是*p的内容为&a的地址值即指向变量a,但是由于类型是void *,故编译器不知道取几个字节,编译不通过
	printf("%d\n",*(int *)p);//可以万能之争类型p转成具体的类型,编译器就知道取值的长度了
	system("pause");
	return 0;
}

你可能感兴趣的:(c/c++,C语言,野指针)