指针为什么要定义类型

指针为什么要定义类型

指针的类型不并能决定指针指向的是一个什么类型的数据

指针就是个变量,用于存放内存地址。地址的唯一作用是标识一块内存空间的。在这块内存空间里放什么类型数据都是可以的。来看看以下代码段:

int main()
{
	int a = 0x11223344;	//假定变量a在内存中的存储地址为0x00000000
	int* p1 = &a;
	char* p2 = &a;
	double* p3 = &a;
	
    printf("%p\n", p1);	// 输出结果为0x00000000
    printf("%p\n", p2); // 输出结果为0x00000000,这里注意,编译会告警,但是不会报错
    printf("%p\n", p3); // 输出结果为0x00000000,这里注意,编译会告警,但是不会报错
	return;
}

在不对内存进行操作的情况下,使用不同类型的指针都可以用在存储变量int a的地址(当然,也可以用来存储任意的其他类型)。

指针的类型决定了对指针解引用时,一次访问的空间大小

  • int *p解引用时,一次访问4个字节的地址
  • char *p解引用时,一次访问1个字节的地址
  • double *p解引用时,一次访问8个字节的地址
  • 其他的类型逻辑都是相同的…

指针的类型决定了指针移动时的步长

来直接看看代码吧:

int main()
{
	int a = 0x11223344;	//假定变量a在内存中的存储地址为0x00000000
	int* p1 = &a;
	char* p2 = &a;
	double* p3 = &a;
	
    printf("%p\n", p1+1); // 输出结果为0x00000004,int* 一次跨越4字节地址
    printf("%p\n", p2+1); // 输出结果为0x00000001,char* 一次跨越1字节地址
    printf("%p\n", p3+1); // 输出结果为0x00000008,double* 一次跨越8字节地址
	return;
}

避免出现野指针

概念:野指针说的是指针的位置是不可知的(随机的、不明确、没有限制)

出现野指针的原因

  1. 指针未初始化

    int main()
    {
        int *p; //局部变量指针未初始化、默认为随机值
        *p = 10;
        return 0;
    }
    
  2. 指针越界访问

    int main()
    {
        int arr[3] = {0};
        int* p = arr;
        for(int i = 0;i<5;i++)
        {
        	*(p+1) = 1; // 指针访问范围超出arr数组范围时,P就是野指针
        }
    }
    
  3. 指针指向的空间被释放

    int* test()
    {
        int a = 10;
        return &a;	// 函数结束时,所占的空间会被系统回收
    }
    int main()
    {
        int *p = test(); // 方法返回的地址实际上已经被操作系统回收,int *p变成了野指针
        *p = 20;		 
        return 0;
    }
    

如果避免野指针

  1. 指针声明即初始化
  2. 小心指针越界
  3. 指针指向空间被释放时,让指针指向NULL
  4. 使用指针前,检查有效性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值