指针的相关知识

1指针是什么

首先内存中划分为⼀个个的 内存单元 ,每个内存单元的⼤⼩取1个字节。我们要找到这个内存空间或者要去访问这个 内存空间 ,就得知道这个这个内存单元的 地址 ,这个地址就是 指针 ,就好比如一个宿舍楼里面有很多有个房间,每个房间里面可以住八个人,然后你要去你自己的宿舍就要知道自己宿舍的门牌号,门牌号就等同于地址,宿舍楼就是内存,内存单元就是这写房间。
所以总结一下: 内存的编码==地址==指针

2一级指针

一级指针就是我们常说的指针变量,我们通常叫它指针,指针变量就是存放地址的变量,但是指针有属于自己的空间,所以指针会有自己的地址,只是他的空间里面放的是别人的地址。

如图:

(1)如何定义一个指针变量呢?

数据类型*变量名称。

数据类型是这个指针存的那个地址的数据类型。也就是指针指向的数据类型。

如果我们想要得到一个变量的地址的话,可以用取地址符号(&);来取得这个变量的地址。

int main()
{
   int a=0;
   int *p=&a;//这里指针存的是a的地址,a是一个整形所以这么写
   return 0
}

 此时我们想要打印a的话,我们可以直接访问a;也可以使用指针来间接访问a,间接访问需要用解引用符号(*),对指针进行解引用;如:

int main()
{
   int a=0;
   int *p=&a;
   printf("%d",a);//直接访问
   printf("%d",*p);//间接访问
   return 0;
}

3野指针

在定义一个指针的时候我们同时就会对指针进行初始化,例如将某个变量的地址来将指针初始化,或者将指针置为空指针,代码如下:

int main()
{
   int a=0;
   int *p=NUll;//置为空指针。
   int *e=&a;
   return 0;
}

(1)野指针的成因

()(1)指针不初始化

如果我们指针初始化的话这是指针指向是随意的,就如你如果对一个整形的变量不初始化,这是整型变量的值是任意的整数,这就会导致野指针的出现。

int main()
{
   int *p;//野指针
   return 0;
}

()(2)指针越界访问 

当你定义了一个数组,然后你用指针去访问了超过了这个数组长度的空间就会导致野指针。

如下:

#include <stdio.h>
int main()
{
 int arr[10] = {0};
 int *p = &arr[0];
 int i = 0;
 for(i=0; i<=11; i++)
 {
 //当指针指向的范围超出数组arr的范围时,p就是野指针
 *(p++) = i;
 }
 return 0;
}

()(3)指向被释放的空间

当你的指针指向的那块空间已经被释放了就会导致指针成野指针;

如下:

#include <stdio.h>
int* test()
{
 int n = 100;
 return &n;
}
int main()
{
 int*p = test();
 printf("%d\n", *p);
 return 0;
}

这看似test函数返回了一个n的地址,但是在执行完这个test函数之后n的所占用的空间就被释放了,因为n 的生命周期只在test函数开始到这个函数结束,这就导致p成了一个野指针。

 

(2) 如何避免野指针

()(1)初始化指针

如果明确知道指针指向哪⾥就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL.
NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错。

()(2)小心指针越界

⼀个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是 越界访问。

()(3)指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性

当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的时候,我们可以把该指针置为NULL。只要是NULL指针就不去访问, 同时使⽤指针之前可以判断指针是否为NULL。
int main()
{
 int arr[10] = {1,2,3,4,5,67,7,8,9,10};
 int *p = &arr[0];
 for(i=0; i<10; i++)
 {
 *(p++) = i;
 }
 
 p = NULL;//此时p已经越界了,可以把p置为NULL
         //下次使⽤的时候,判断p不为NULL的时候再使⽤
        //...
 p = &arr[0];//重新让p获得地址
 if(p != NULL) //判断
 {
     printf("%d",*p);
 }
 return 0;
}

4二级指针

二级指针是指向一级指针的指针。

定义:

数据类型**变量名。

可以这么理解,靠近变量名的*,代表这个变量是指针,而数据类型*代表这个指针指向的是一个指针。

#include<stdio.h>
{
   char *p=NULL;
   char **p1=&p;//这里取出的是指针p的地址。
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小w o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值