1、指针数组
由指针组成的数组,数组的每一个元素均为一个指针。
例:int *a[i]
1、1指针数组存储
定义一个指针数组a,其数组的每一个元素均为一个指针,而指针在空间中占8个字节,根据数组的空间特性可知指针数组的空间大小为 : 元素个数*8 == i * 8
1、2指针数组的用法
主要用于字符串数组中,如下定义一个指针数组,其数组每个指针指向一个字符串的首地址。
该数组可以理解为一个二维数组,不过与二维数组不同的是,二维数组存储的是字符串(即一维字符数组);指针数组中存储的是指向各字符串常量的首个字符的地址;
即指针数组内每个指针所指向的值无法被改变
2、数组指针
可理解为是指向数组的指针,即若对一维整型数组a取地址,则得到数组a的指针。
该指针指向的为该数组整体,其内存空间大小取决于数据类型和元素个数,不再是8字节
3、数组与指针的关系
3、1 一维数组与指针的关系
即若有数组a,指针变量p,p=&a或p=a(一维数组名为指向第一个元素的地址的指针);
即a[i] == *(a + i) == *(p + i) == p[i]
3、2 二维数组与指针的关系
定义二维整型数组
int a[m][n] = {0};
int *p = NULL;
int (*q)[n] = NULL;
p = a[m];
q = a;
其中p为指针变量,p = a [m]为p是二维数组中指向第一行第一个元素的地址,可安照一维数组与指针关系理解;p = a[m] + n表示为该行第几个元素;p=a[m+1]即为指向下一行;
其中q 为数组指针,q = a可理解为将二维数组看作由一维数组组成,a为该数组名指向第一个元素地址
若要访问二维数组中的元素,有以下方式
a[m][n] 按元素下标访问
*(a[m] + n) 指向第m行第n个元素
*(*(a+m) + n) 按一维数组与指针关系演化(a[i] == *(a + i) == *(p + i) == p[i])
*(p + m*N + n) N为列数,固定不变,p指向二维数组第一个元素地址,该方法按数存储的连续性访问
*(*(q + m) + n) 数组指针q,指向第一个数组,+m则指向第m个数组的第一个元素,参考一维数组指针关系
*(q[m] + n) 同上
q[m][n]
4、二级指针
即指向指针的指针,常用在函数传参中
像指针数组的数组名就是一个二级指针,即指向指针的指针。
若要在函数要对外部指针变量操作修改时,传参就需要传递二级指针,即指针的地址
例:
int fun(char **pptmp)
{
*pptmp = "hello world";
return 0;
}
int main(void)
{
char *p = NULL;
fun(&p);
printf("p = %s\n", p);
return 0;
}