0
点赞
收藏
分享

微信扫一扫

C++指针详解3_指针数组与数组指针

千白莫 2022-05-03 阅读 82
c++

本节主要内容

  • 指针数组与数组指针
  • 多维数组指针差异


指针数组

顾名思义,一个数组内存储的都是指针那么他就是一个指针数组;
指针数组具有如下特性:

  1. 指针数组中存储的指针可以指向同类型的数组或者单个数值
  2. 指针数组可以延后初始化(而普通数组必须在声明时执行初始化分配内存空间)
  3. 使用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
  1. arr是一个二维数组,每一维度存放3个元素
  2. arr = &arr[0]
  3. *arr = &arr[0][0]
  4. **arr = arr[0][0]
  5. 要明白这么个事实:只有第一维度才存储实际值,第二维度存储的都是第一维度的指针!
    也就是说 arr[0] = &arr[0][0]
  6. 所以如上图所示的代码结果均为1,即数组中的第一个元素

数组指针

指向一个多维数组我们就需要使用数组指针,下面的代码指示为多维数组mat取了个别名p1,我们对p1的使用就相当于对mat的使用

注意数组指针的书写语法,他省略了原数组的第二维度元素定义,改为使用指针替代,但是保留了第一维度元素定义

int mat[][2] = {{1,2},{4,5},{6,5}};
int (*p1)[2] = mat;
举报

相关推荐

0 条评论