一 . 字符指针变量
在指针的类型中,有一种是字符指针:char * ,用法如下:
下面我们通过一道试题来加深理解:
看着这个运行结果,是不是跟自己心中预想的答案有一些出入呢?下面为诸君解读一下:
在这段代码中,str3 和 str4 指向的是同一个常量字符串。我们C语言(或者C++)中,会把常量字符串储存到单独的一个内存区域中,当这里的几个指针指向同一个字符串的时候,他们实际上就是指向了同一块内存。但是当我们用相同的常量字符串去初始化不同数组的时候就会开辟出不同的内存块,因此 str1 和 str 2不同,str3 和 str4 相同
二 . 数组指针变量
之前我们学习了指针数组,指针数组是一种数组,数组中存放的是指针(地址)
那么我们的数组指针变量是指针变量还是数组呢?答案是——指针变量
我们之前了解到过的:
整型指针变量:int * print 存放的是整型变量的地址,是能够指向整形数据的指针
浮点型指针变量:float * pf 存放的是浮点型变量的地址,是能够指向浮点型数据的指针
由此可得:数组指针变量应该是存放的数组的地址,是能够指向数组的指针变量
我们可以先试着思考一下:以下代码哪一个是数组指针变量?
答案应该是第二个,数组指针变量的正确格式如下:
我们的 p 会先和 * 结合,说明 p 是一个指针变量,然后指针指向的是一个大小为 10 的整形数组。p 是一个指针,指向一个数组,这就是我们数组指针的定义
三 . 数组指针变量的初始化
既然我们了解了数组指针变量是用来放地址的,那我们怎样才能获得数组的地址呢?这里就要运用我们之前学过的一个知识点:取地址符号——&,通过&数组名就可以获得数组的地址(也就是数组首元素的地址)
我们通过调试可以看到,&arr 和 p 的类型是一模一样的,都是 int [ 10 ] *,如图:
通过数组指针类型的解析,我们可以更简单的看懂其构造含义:
四 . 二维数组传参的本质
了解了数组指针,我们就可以来深入了解二维数组传参的本质了
二维数组一般的传参格式:
这里的实参是二维数组,形参也是二维数组。那么我们有没有其他的写法呢?
当然是有的,我们将二维数组看做是每个元素是一维数组的数组,也就是二维数组的每个元素都是一个一维数组,那么二维数组的首元素就是第一行,是一个一维数组
所以,我们根据数组名是数组首元素地址这个原则,二维数组的数组名就表示第一行的地址,是一维数组的地址,那么在上面的例子当中,第一行一维数组的类型就是 int [ 5 ] ,所以第一行的地址类型就是 int ( * ) [ 5 ] ,那就意味着二维数组传参本质上就是传递了地址,而且传递的是第一行这个一维数组的地址,所以总结下来,我们形参也可以写成指针形式,如下:
总结:二维数组传参,形参部分可以写成数组,也可以写成指针形式
OKK,有关于指针的数组指针这一小部分我们今天就说到这里啦,最近开学比较忙,更新较迟,还望诸君见谅哈。我看大家一直都比较佛系,断更了从来也没有催更的哈哈哈哈哈。接下来尽量保持三四天一更的速度。咱们下期再见!与诸君共勉!!!