【C语言入门篇】深入理解指针(2)
🌈个人主页:开敲
🔥所属博客:C语言
🌼文章目录🌼
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二维数组传参 ![](https://i-blog.csdnimg.cn/blog_migrate/bac6e64a8aa46c24ecea52b9b5228556.png)
在我们以往二维数组传参的时候,形参部分也是用一个二维数组来接收。那么我们如果想用数组指针来接收的话应该这么创建数组指针呢?
我们知道,这里的arr传的是数组的首元素地址,那么二维数组的首元素地址是什么呢?
答案: 二维数组的首元素地址就是二维数组第一行的地址,也可以理解为是一个一维数组,这个一维数组中存放的是二维数组第一行的元素,下面我们画图来理解
这个图中,arr(首元素地址)所代表的就是数组中第一行的地址,我们将第一行单独拿出来,不难发现,arr(首元素地址)实际上就是一个一维数组,这个一维数组存放的是二维数组中第一行的元素。知道了这个以后,我们就可以知道如何用数组指针来接收二维数组,如下:
5.函数指针
5.1函数指针的创建
和前面的数组指针类比一下我们不难知道,函数指针也是指针,用来存放函数的地址。
那么函数指针又该如何创建呢?上代码:
可以看到,这里取地址的方式有两种,一种是直接放函数名,另一种则是在函数名前加上了&符号,这两种写法是一样的,用哪种都可以。()内的类型可以直接写成(int,int),变量名可以省略不写。下面来对函数指针解剖分析:
5.2函数指针的使用
这两种写法是一样的。
深入理解指针(2) 完.