Bootstrap

深入理解指针2

1. 如何理解数组名

数组名表示数组首元素的地址,举个例子:

在这里,数组名和&arr[0]输出的地址是一样的,说明数组名的本质就是地址,还是数组首元素的地址。但是有两个例外,除了这两个例外,其他的数组名都表示数组首元素地址。

1.1 sizeof(数组名)

之前我们在求数组的长度的时候,会用到sizeof(数组名)/sizeof(arr[0])这个表达式,如果这里的sizeof(数组名)表示的是首元素地址的话,那就出来的结果就是1,而不是数组的长度了。

所以,sizeof(数组名)表示的是数组里面全部数据所占据的大小,单位是字节。

1.2 &数组名

&数组名表示取出的是整个数组的地址,与首地址不同。

当&数组名+1时,跳过一整个数组的地址。而数组名+1跳过的是首元素的地址。

如图:

1.3 数组名的部分运用

当我们输出全部数组的时候,是不是会用到arr[i];那既然数组名就是首元素地址,那我们就可以用  *(arr+i)来输出对应的元素了。

2. 一维数组传参的本质

我们知道,数组是可以传参给函数的,那他传参的本质是什么呢?上面讲了,数组名的本质是数组首元素的地址,那么传参的本事是不是传递的数组首元素的地址呢?

当在内部输出的时候,输出为7,当在函数体内部,输出则为1.这是为什么呢?很明显,sizeof(arr[0])是4,那sizeof(arr)肯定也是4,那才能为1.因此,这里的arr只是一个四个字节的地址,而不是一整个数组。

所以我们得出结论:一维数组传参的本质是传递的首元素的地址。

那么,我们函数在定义的时候,是不是可以就直接用指针定义了呢?答案是的。

可以看到,在用指针接收参数的时候也是完全ok的。

3.指针数组与数组指针

3.1指针数组

3.1.1 指针数组是什么?

我们类比一下,整型数组,字符数组,都是数组吧。那指针数组也是数组,只不过里面放的是指针而已。

3.1.1 指针数组的理解

整型指针数组的格式是:int * arr[]。

理解:arr与[]先连接,表示是数组,int * 表示存放的是返回值为整型的指针。

3.1.3 指针数组的运用--用指针数组模拟二维数组

指针数组里面存放的都是指针,如果指针都指向不同的一维数组,那是不是就构成了一个二维数组呢?开始实践:

用一维数组的首元素地址都放入到指针数组里面,模拟一个二维数组。由于图中注释的等价关系,我们直接用二维数组的方式输出了相应的数据

3.2 数组指针

3.2.1 数组指针是什么

数组指针是指向数组的指针,是一种指针。

3.2.2 数组指针的理解

整型指针数组的格式是:int (* arr)[]。

*与arr先连接,表示是arr是一个指针,后面的[]表示指向的是一个数组,int表示数组里面存放的是int类型的数据。

4.二级指针

二级指针就是一个指向指针的指针。我们知道,指针里面存放的是地址,地址指向的一个数据,但这个指针是不是也需要一个空间来存放它吧。因此我们再用一个指针来指向存放地址的指针,这便是二级指针,即指向指针的指针。

表现形式:

这便简单的完成了一个二级指针的定义。pa指向a,pb指向pa。

这是对二级指针的简单调用。

对二级指针进行一次解引用找到的就是pa的地址。进行二次解引用找到的是a的地址

5.各类指针

指针根据返回类型的不同,分为函数指针,字符指针,数组指针等。上面简单介绍了数组指针,下面进行进一步的讲解。

5.1 字符指针

指向字符的指针称为字符指针。

基本的定义格式如上图。

需要注意,字符指针只能指向字符,而不是字符串。如果想要指向字符串,即将字符串存入到数组里面,那就是我们下面要介绍的数组指针了。

5.2 数组指针

指向数组的指针称为数组指针。

根据数组里面存放的数据类型不同又可以分为整型数组指针和字符数组指针

5.2.1 整型数组指针

数组指针中数组存放的是整型数据的指针叫做整型数组指针。

整型数组指针的格式:

理解:pa与*相结合,说明pa是一个指针,[10]表示指向的是数组,元素数量为10个,

int 表示里面存放的数据是整型。

5.2.2 字符数组指针

数组指针中数组存放的是整型数据的指针叫做整型数组指针。

字符数组指针有两种定义方式:

一种是通过先定义一个字符数组,再将p1的指针指向该数组。

第二种是直接定义const char * p2。

我们知道,指针存放的是地址,那么这里p2存放的就是字符串“abcdef"的首元素的地址。

需要注意的是:第二种方式所定义的字符数组指针是不可以修改的。

5.2.3 函数指针

指向函数的指针成为函数指针。里面存放的是函数的地址。

5.2.3.1 函数的地址

获取函数地址的方法:

1. 函数名

2.&函数名

5.2.3.2 函数指针的格式与理解

主函数里面的1、2行定义了两个函数指针,指向add函数。

*与p相结合表示p是指针,后面的部分是函数的参数,表示p指向的是一个函数,int 表示函数的返回类型是整型

5.2.3.3 函数指针的调用

在函数指针后面的参数部分按照函数的定义输入值便可以进行函数指针的调用了

;