1、野指针,既没有初始化的指针,//如果没有给指针初始化,则指针p的内容为随机地址,会随机指向,故成为野指针,不可以操作野指针
#include "stdio.h"
#include <stdlib.h>
int main()
{
//1、野指针,即没有初始化的指针
//int a = 0;
int* p ;//没有给指针初始化,则指针p的内容为随机地址,会随机指向
//指针的初始化必须是系统分配的内存,不能自己手写赋值0x010203040,这种内存地址不安全
*p = 200;
printf("p:%d\n",*p);
return 0;
}
未初始化,指针会随机指向
初始化,指向系统分配的内存地址
2、空指针:将指针的值为0,即0x00000000 = NULL(大写),指针使用完毕要养成置空的习惯,判断指针是否为NULL,判断是否被使用
#include "stdio.h"
#include <stdlib.h>
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 <stdlib.h>
int main()
{
//3、万能指针:可以保存所有类型的指针
int a = 10;
void* p = (void *)&a;
printf("%d\n", *p);//编译失败,非法的间接寻址,指针变量p保存的地址类型为void*类型,
//但是*p的内容为&a的地址值即指向变量a,但是由于类型是void *,故编译器不知道取几个字节,编译不通过
system("pause");
return 0;
}
万能指针可以通过类型p转成具体的类型,编译器就知道取值的长度了,之争取值(1、起始地址2取值的长度)
#include "stdio.h"
#include <stdlib.h>
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;
}