字符指针变量
在指针中有一种指针类型为 char*
还存在一种使用方法:
问题1:请问这里是把一个字符串放到pstr指针变量里了吗
这里其实是把字符串的首字母地址传到了指针变量当中
在《剑指offer》中收录了⼀道和字符串相关的笔试题,我们⼀起来学习⼀下:
问题2:上面代码运行结果会是如何?
这是因为:str1和str2
⽤相同的常量字符串去初始 化不同的数组的时候会开辟出不同的内存块
这⾥str3和str4指向的是⼀个同⼀个常量字符串。
C/C++会把常量字符串存储到单独的⼀个内存区域, 当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。
数组指针变量
存放数组的地址,能够指向数组的指针变量
例如下:
int (*p2)[10];
p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。所以
p是⼀个指针,指向⼀个数组,叫 数组指针。
这⾥要注意:[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合。
如何获得数组的地址

如果要存放个数组的地址,就得存放在数组指针变量中,如下:

二维数组传参本质
⼆维数组起始可以看做是每个元素是⼀维数组的数组,也就是⼆维 数组的每个元素是⼀个⼀维数组。那么⼆维数组的⾸元素就是第⼀⾏,是个⼀维数组。
根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀
维数组的地址。根据上⾯的例⼦,第⼀⾏的⼀维数组的类型就是 int [5] ,所以第⼀⾏的地址的类
型就是数组指针类型 int(*)[5] 。
⼆维数组传参本质上也是传递了地址,传递的是第⼀ ⾏这个⼀维数组的地址

19行中传递了二维数组名地址,即二维数组首地址,也就是第一行的地址 int (*p) [5]
11行*(*(p+i)+j)可以理解成(*p)[i][j]
函数指针数组
那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针。