初识指针以及野指针的概念

@[toc]1.内存和地址

@[toc]内存和地址

在c语言的学习过程中,我们大都会创建到变量,但是我们所创建的变量其实就是向内存申请一片空间内存或者叫地址,所以每个变量都有自己的一片空间内存或者地址,就像每个房间都有对应自己的门牌号一样,而我们可以根据得知一个地址很快找到所对应的值,就像得知门牌号一样很快找到对应的房间,生活中我们把门牌号也叫做地址,在计算机中我们把内存单元的编号也称为地址,在c语言中,地址也叫做指针。

下边是内存单位的关系以及名称

@[toc]2.指针变量和地址

我们已经知道,在我们创建变量的时候就是向内存申请一片空间,如下图

我们创建a变量的时候,向内存申请了四个字节的空间,用于存放整数,他们的地址分别为如下图

如果我们要取出a的地址,那就要用到一个符号&,也叫取地址操作符

由于作者刚刚把调试给关了,现在打印出来的地址跟前两个图都不一样,大家可以自己在编译器里试一下,就知道打印出来的地址是一样的,但是打印的是四个字节中最小的那个地址,得知最小的那个地址之后就可以顺藤摸瓜得知后面三个地址。

既然得知了取地址操作符,那么我现在要说的是解引用操作符*,解引用操作符则是与取地址操作符相反,

如图,p是用来存放a的地址,在解引用之后,也就是*p其实就是指向a那片空间所对应的值,但是我们通过地址更改了a的值,换种简单点的说法就是*p==a。

指针变量的大小:

在x64的环境下,指针变量的大小都为8

在x86的环境下,指针大小都为4

@[toc]3.指针变量类型的意义

 由上边的图得知,不论是哪种类型,指针变量的大小都是一样的,那为什么我们还要给他们区别开类型呢。其实他们每一种类型所更改的字节大小是不一样的,如下图

由图就可以看出,int型可以更改4个字节大小,而char更改1个字节大小,所以类型不同,所更改字节的大小也不同,double可以更改8个字节,float更改4个字节,short更改2个字节。

void*类型指针是用来存放任意类型的地址,但是不能进行指针之间的运算,所以void*类型指针大多数使用在函数调用时候的形参接收实参的地址。

@[toc]4.const修饰指针

我们知道变量是可以修改的,但是如果我们加上const修饰的话,那么就会限制变量,使变量得不到修改

指针也是一样的,只要在const在*号的左边,那就不能通过*p更改a的值

如果const在*右边

@[toc]5.指针运算

指针+-整数

在数组中内存是连续存放的,只要我们知道第一个地址,就可以找到后面所有的元素

指针-指针

指针-指针的绝对值就是得到的是两个地址之间的元素个数。

@[toc]6.野指针

至于野指针的成因有很多,我现在可以列举几个:1.指针未初始化。

2.指针越界访问。

3.指针指向的空间释放

那么我们应该如何规避野指针的出现呢?

1.要给指针初始化。

2.小心指针越界。

3.指针变量不再使用的时候,及时用NULL,指针使用之前要检查有效性。

4.避免返回局部变量的地址。

以上就是作者所总结有关指针的知识,作者目前还是个小白新手,对于创作这方面还要慢慢熟悉,如果有错误请大家帮忙指出,作者会及时更改,谢谢大家!

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值