数组指针。
数组指针(行指针),定义 int (*p)[N]; 表示的是p是一个指针,指向一个整型的一维数组,该数组的长度是N,若执行 p+1, p将会跨过N个整型数据的长度。
在数组指针中,()的优先级高。
int(*a)[10] : a是一个数组指针,指向一个含有10个int元素的数组。
-------------------------------------example:-----------------------------
指针数组
指针数组,定义 int *p[N]; [ ] 先和p结合成一个数组,而 int * 说明这是一个整型指针数组,其中有N个指针类型的数组元素。指针数组指的是一个数组里面装的是指针。
执行p+1是错误的 ;
执行p=a是错误的, 因为p是个不可知的表示。
只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
*p=a是正确的,这里 *p 表示指针数组第一个元素的值,a的首地址的值。
在指针数组, [ ] 的优先级高。
int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]。
比如,字符指针数组不能用于直接存放字符串,因为指针数组的元素存放的都是存储单元地址的指针变量,不能直接存放数值。
修改方案: 定义一个二维的字符数组,再把每行的起始地址赋给指针数组的相应元素。
总结:
数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
拓展:
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j] 都是正确的。
函数指针(指向函数的指针)
函数指针定义: 数据类型标识符 (*指针变量名)( );
eg: int (*p)(); p是一个指向函数的指针,函数的返回值是整型。
指针函数
指针函数定义: 数据类型标识符 *函数名 ( 形参数据说明表列 );
通过返回一个数据的存储单元地址或者一个数据集合的存储单元的起始地址,达到返回一个数据或者一个数据集合的目的。
int *p(); 定义一个返回值是指针型数据的函数
结构体数组
结构数组就是一个数组,只不过数组中各元素的数据类型是结构类型罢了。