深入学习指针(1)

本文详细解释了指针在C语言中的作用,包括内存单元的编号即地址的概念,指针变量的取地址和解引用操作,不同类型指针的特性,以及const修饰指针和野指针的形成原因。
摘要由CSDN通过智能技术生成

讲解指针呢,首先得对内存和地址存在一定的了解。

内存与地址:

假如你有个朋友叫小可,而小可则住在一栋大学教学楼的五楼,但是五楼十几个个编号如下图的房间,这样一个一个的找,无疑会效率很低,费一番力气才能找到小可的房间。

但如果我们有了房间的号码的话,就不同了,这样我们就可以很轻松的找到小可了!

如上面我们类似于计算机也是如此:

计算机高效来管理其储存的内存空间,其实是把内存分化为一个个的内存单元,每个单元则取一个字节的大小。

我们的内存单元就相当于一个学生的宿舍,门牌号就相当于地址,在计算机中我们把内存单元的编号也称为地址,而我们的c语言给地址取了个新的名字:指针。

由上面而言我们可以总述为:

                                    内存单元的编号==地址==指针

接下来将才算对指针有了一定的认识:

指针变量和地址:

(1)取地址操作符(&)

在c语言中我们创建的变量,其实就是向内存申请空间,而这个空间的地址我们又如何获得呢?

上图的0000007C450FFAC4则是变量a的地址,这样上图就是以取地址操作符(&)来获得变量的地址。

(2)指针变量和解引用操作符(*)

1、指针变量

有时我们得到一个地址但我们后续需要用到这个地址,那我们肯定需要一个东西来储存这个地址,那我们的指针变量就派上用场了。

上图则是将变量a的地址存储在指针变量p中。(指针变量也是一种变量,这种变量的作用就是来存放地址的)

简单提要一下:

p的左边是int *,*指的是p是指针变量,int是指p指向的是整型类型的对象。

(2)解引用操作符(*)

我们将地址保存起来,但是我们怎么去使用它呢?

而这里我们的解引用操作符(*)则要发挥它的作用了!如下图:

上图*p的意思是通过指针变量存储的地址,找到指向的空间,简而言之就是*p就相当于变量a。

而有的人就会问了,为什么这样*p=0,直接将a=0,不是更好嘛?事实确实是这样的,但是这样更可以增加我们改变变量a的另一种途径,到了后续的学习我们写代码就可以更加灵活了。

(3)指针变量的大小

我们的指针变量是用来存放地址的,我们指针变量的大小取决于平台和类型无关

32位平台下的地址是32个bie位,指针变量的大小则为4个字节

同理64位平台下的地址是64个bit位,指针变量的大小则为8个字节(上图则是64位的平台下)

指针变量类型的意义:

指针类型是有特殊意义的,接下来我们将来一起了解知道它的意义!

(1)指针的解引用

第一张图会将n的四个字节全部改为0,而第二张图则只会将n的一个字节改为0。

指针类型决定了一次能操作几个字节。

例如:int*类型的指针的解引用就能访问四个字节,而char*类型的指针的解引用只能访问一个字节。

(2)指针+-整数

由图可以看得出来,int*类型的指针变量+1跳过四个字节,char*指针类型的变量+1跳过一个字节,简而言之,指针的类型决定了指针向前走或向后走一步有多大

(3)void*指针

void*指针在指针类型中是一种特殊的存在,可以理解为无具体类型的指针(或者叫泛型指针),其可以用来接收任意类型的指针。但其存在也有局限性,不能直接进行指针的加减整数,和解引用的运算。

重点在于:一般void*类型的指针使用在函数参数的部分,用来接收不同数据的类型,这样的设计可以实现泛型编程的效果。

const修饰指针变量:

(1)const修饰变量

变量是可以修改的,但是有时候我们也需要将其进行限制,使其无法修改。这样我们的const就可以派上用场了。

如上图变量n是可以修改的,m是不能修改的。因为被const修饰后,在语法上加了限制,只要我们将m进行修改,不符合语法规则,就会报错。但是我们绕过n将一个指针变量来存放n的地址对该指针变量解引用来修改该数,但是这样就打破了const的限制,这是存在不合理的,那我们接下来该怎么做呢?

(2)const修饰指针变量

const放在*的左边和右边它的意思是不一样的!(切记)

这样是const放在*的左边,*p就无法被修改了。

这样是const放在*的右边,p就无法被修改了。

由上可知:

const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容,不能通过指针来改变,但指针变量本身的内容可变。

const如果放在*的右边,修饰的是指针变量本身,保证指针变量的内容不能修改,但是指针指向的内容,可以通过指针发生改变。

野指针:(指针指向的位置是不可知的)

(1)野指针成因

1,指针未进行初始化

2,指针越界访问

3,指针指向的空间释放

  • 31
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值