本节主要内容
- 指针数组与数组指针
- 多维数组指针差异
指针数组
顾名思义,一个数组内存储的都是指针那么他就是一个指针数组;
指针数组具有如下特性:
- 指针数组中存储的指针可以指向同类型的数组或者单个数值
- 指针数组可以延后初始化(而普通数组必须在声明时执行初始化分配内存空间)
- 使用malloc对指针数组中元素分配内存时,sizeof的对象应该是该指针数组所使用的数据类型
// 声明一含有5个指针的指针数组
int *arr[5];
// 执行五次,每次为一个元素分配内存以及填入数值
for(int i=0;i<5;i++){
*(arr+i) = (int*)malloc(sizeof(int));
**(arr+i) = i;
}
对以上代码的解释:
*(arr+i) 表示取出数组元素,实际上还有一种简化写法arr[i];
**(arr+i) 因为指针数组内元素是一个指针, 所以我们需要再次对数组元素解引用才可以对其赋值
多维数组取指针差异
一维数组的指针易于理解,而多维数组的指针会呈现出逐层嵌套的关系,依托以下代码,我们对其做出简要的解释
int arr[3][3] = {
{1, 2, 3}, {4, 5, 6}, {7, 8, 9}
};
printf("%d\n",**arr); // 输出1
printf("%d\n",*arr[0]); // 输出1
printf("%d\n",arr[0][0]); // 输出1
- arr是一个二维数组,每一维度存放3个元素
- arr = &arr[0]
- *arr = &arr[0][0]
- **arr = arr[0][0]
- 要明白这么个事实:只有第一维度才存储实际值,第二维度存储的都是第一维度的指针!
也就是说 arr[0] = &arr[0][0] - 所以如上图所示的代码结果均为1,即数组中的第一个元素
数组指针
指向一个多维数组我们就需要使用数组指针,下面的代码指示为多维数组mat取了个别名p1,我们对p1的使用就相当于对mat的使用
注意数组指针的书写语法,他省略了原数组的第二维度元素定义,改为使用指针替代,但是保留了第一维度元素定义
int mat[][2] = {{1,2},{4,5},{6,5}};
int (*p1)[2] = mat;