C语言初识指针


指针类型的意义
野指针
如何避免野指针

指针类型的意义

1.不同类型指针决定了指针解引用的时候访问的权限有多大
2 指针类型决定了指针走一步能走多远,也就是步长

在这里插入图片描述

如图上,这里是字符类型指针解引用一次只能访问一个字节,
那如果是int*的整形指针,则会把11,22,33,44这四个字节都变成0,
说明整形指针一下可以访问四个字节

在这里插入图片描述


指针走一步能走多远

在这里插入图片描述

如图上,为什么产生了区别,是因为p和pc的类型不相同
字符指针+1相当于跳过一个字符,跳过一个字符就相当于+1嘛
如果是整形指针的话+1相当于跳过一个整形,如果跳过一个整形相当于跳过四个字节
整形指针跳过四个字节,看下图

在这里插入图片描述


野指针

概念:指针就是指针指向的位置是不可知的{随机、不正确、没有限制的}

造成野指针的原因有哪些?
1 指针未初始化
2 指针越界
3 指针指向的空间释放

在这里插入图片描述

1 指针未初始化 ,如图上

 因为p是局部指针变量,局部变量不初始化默认随机值,也就是p指向了未知的内存空间
 这时候解引用p,就属于非法访问内存空间,p就为野指针

2 指针越界

在这里插入图片描述

arr整型数组,有10个元素,初始化元素值为0,arr数组名表示首元素地址传给了指针p,
通过对指针解引用改变数组元素值,当i=10时,此时*p访问的内存空间不在数组有效范围内,此时*p就属于非  
法访问内存空间,p为野指针

3 指针指向的空间释放

在这里插入图片描述

这时候这块空间已经还给操作系统了,在通过*p=20去访问这块空间的时候,p就是野指针了,
属于非法访问内存空间.这里忘记写上*p=20了
原码是
  #include<stdio.h>
  int *test()
  {
  int a=10;
  return &a;
  }
  int main()
  {
  int *p=test;
  *p=20;
  }


如何避免野指针

 1 指针初始化  
 2 小心指针越界
 3 指针指向的空间被释放需及时置NULL
 4 指针使用前检查有效性

1 指针初始化不知道初始成什么的时候可以初始化为NULL

NULL是什么
在这里插入图片描述
要么是0,要么是把0强制类型转换成void *指针类型,但它本质上还是个0
跟int a=0一样的意思

2  c语言本身是不会检查数组的越界行为的,

3 指针指向的空间被释放,及时置空

当p这个指针指向的空间已经不属于我的了,要及时把p这个指针变量置空.p=NULL.这也可以预防野指针
在这里插入图片描述

4 指针使用前检查有效性

这样的话,指针要不就是空指针,要不就是指针指向的空间是有效的
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值