指针的相关知识

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;
}

  • 33
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.小董

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

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

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

打赏作者

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

抵扣说明:

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

余额充值