【C语言入门篇】深入理解指针(2)

【C语言入门篇】深入理解指针(2)

 🌈个人主页:开敲

🔥所属博客:C语言

🌼文章目录🌼

1.指针访问数组

    1.1数组名的理解

  1.2 指针访问数组

2.二级指针

3.指针数组

    3.1指针数组模拟二维数组

4.数组指针

    4.1数组指针是什么

    4.2数组指针如何初始化

    4.3二维数组传参  ​编辑

5.函数指针

    5.1函数指针的创建

    5.2函数指针的使用


1.指针访问数组
    1.1数组名的理解

  在学习数组的时候,我们都知道了,数组名就是数组首元素的地址。但是,有两个例外:

  1. sizeof(arr)。sizeof内部单独放数组名时,这里代表的是整个数组,取出了整个数组的地址

这里就是数组名单独放在sizeof内的例子,计算了整个数组的长度。

      2. &arr。数组名前面加上了一个&符号,取出的就是整个数组的地址。

  除了这两个例子以外,其他任何地方使用数组名,代表的都是数组首元素的地址。

  1.2 指针访问数组

  这里指针p指向的就是arr数组的首元素地址,通过p+i的操作对数组中的每个元素进行初始化,再通过*(p+i)拿到数组中的每个元素并打印。

  这里的*(p+i)也可以写成p[i]的形式,因为p存放的就是数组首元素的地址也就是arr,因此,这里将*(p+i)改为p[i]实际上等同于arr[i]。

2.二级指针

  二级指针也是指针变量,也是用来存放地址的,那么是存放谁的地址呢?我们知道,指针变量也是变量,是变量就有地址,那么我们要想存放指针的地址,该用谁来存放呢?没错,就是二级指针,下面来看一个代码:

  这里的ppa就是二级指针变量,可以看出,二级指针和一级指针(pa)相比,多了一个*号。下面我们画图来理解这段代码

可以看到,一级指针pa中存放的是a的地址,而一级指针本身也有一个地址,而这个地址由二级指针来存放,同样的,二级指针本身也有一个地址,那么我们也可以用三级指针来存放二级指针的地址,以此类推下去便有四级、五级、六级等等。

  对二级指针的解引用也是和一级指针类似。*ppa时,解引用访问的是pa的地址;**pa时,则相当于先通过ppa访问到了pa的地址,再通过pa访问到了a的地址。

3.指针数组

  乍一看这个名字就会使人感到困惑——指针数组到底是指针还是数组呢?

  我们来类比一下就能明白了。整型数组是存放整型的数组,字符数组是存放字符的数组,那指针数组不就是存放指针的数组吗。没错,指针数组就是存放指针的数组。所以,指针数组就是数组,存放的是指针,也就是地址。如下图:

  

    3.1指针数组模拟二维数组

  

指针数组parr中存放的指针分别指向arr1、arr2、arr3。在循环打印的时候,这里的parr [i] [j] 可以这样理解,假设现在i=1,j=1,parr [1] 首先找到了指针parr2,而后parr [1]  [1] 就相当于parr2 [1] ,也就相当于arr2 [1] ,也就打印了元素5,以此类推。

4.数组指针
    4.1数组指针是什么

  上面讲到指针数组,那么数组指针又是什么呢?难道也是数组吗?非也~

  答案:数组指针是指针变量。

  既然它是指针变量,那想必它也是用来存储地址的吧?没错,数组指针就是存储的数组的地址,可以理解为指向数组的指针。

  那么数组指针如何创建呢?来看下面这段代码:

这里的int (*parr)[10]就是数组指针,可以看出,数组指针在创建的时候相比指针数组多了一个括号,那么为什么要用一个括号将 *parr 给括起来呢?这就和操作符的优先级有关了。在上面指针数组的创建中,是这样的: int *parr[] 。这里没有括号,因此 parr 先和 [] 结合形成了数组,然后才与前面的 * 结合成为指针数组。而这里的 int (*parr)[] 由于使用了括号将 *parr 给括了起来,使得parr先和*结合成了指针,而后再与 [] 结合,成为了指向数组的指针。

优先级关系:  [] 的优先级高于 * 。

    4.2数组指针如何初始化

  既然数组指针是用来存放数组的地址的,那么数组指针在初始化的时候就需要拿到数组的地址。如下:

这里 &arr 取出的就是整个数组的地址,parr中存放的就是整个数组的地址。

    4.3二维数组传参  

在我们以往二维数组传参的时候,形参部分也是用一个二维数组来接收。那么我们如果想用数组指针来接收的话应该这么创建数组指针呢?

  我们知道,这里的arr传的是数组的首元素地址,那么二维数组的首元素地址是什么呢?

  答案: 二维数组的首元素地址就是二维数组第一行的地址,也可以理解为是一个一维数组,这个一维数组中存放的是二维数组第一行的元素,下面我们画图来理解

这个图中,arr(首元素地址)所代表的就是数组中第一行的地址,我们将第一行单独拿出来,不难发现,arr(首元素地址)实际上就是一个一维数组,这个一维数组存放的是二维数组中第一行的元素。知道了这个以后,我们就可以知道如何用数组指针来接收二维数组,如下:

5.函数指针
    5.1函数指针的创建

  和前面的数组指针类比一下我们不难知道,函数指针也是指针,用来存放函数的地址。

  那么函数指针又该如何创建呢?上代码:

可以看到,这里取地址的方式有两种,一种是直接放函数名,另一种则是在函数名前加上了&符号,这两种写法是一样的,用哪种都可以。()内的类型可以直接写成(int,int),变量名可以省略不写。下面来对函数指针解剖分析:

    5.2函数指针的使用
    

这两种写法是一样的。

                                                              深入理解指针(2) 完.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值