一、引言

说起二维数组可能首先想到的是各种嵌套的for循环,二维数组的初始化,二维数组的赋值,二维数组的输出等各种问题,当然了,数组的问题永远离不开指针,而二维数组所能联系到的就是二维指针了,此文则是着重讲解二维数组与二维指针之间的关系。

二、初始化与赋值

#define M 4
#define N 5
int arr[M][N]  = {{2,3,4,5},{3,5,},{6,},{9,8}};

但是大多数情况下,我们一般是如下的操作:

int arr[M][N] = {0};
for(int i = 0; j < M; i++)
{
for (int j = 0; j < N; j++)
{
    a[M][N] = i * j + j;
}
}
这样的操作是没什么问题的,但是我们有时候,我们的M和N并不一定是常量,大多数情况下是一个变量的话,我们需要动态的在堆上new一个数组出来,则需要做如下的代码:

int M = 5; int N = 4;
int **p = new *int[M];   //此处p指向每个int数组指针的首地址
for (int i = 0; i < M;i++)
{p[i] = new int[N];   //每个数组指针又指向一个int数组,或者这样写//*(p+i) = new int[N];
}

而我们释放这块堆内存的时候可以入下面这样写:

for(int j = 0; j < M; j++)delete [] p[j];delete [] p;

三、数组和指针之间的关系
二维数组和二维指针有千丝万缕的关系,可以这样建立两者之间的关系,

如下面的代码所示,两两的代码是等价的:

#include <iostream>int main(void)
{int a[4][5] = {2,3,4,5,6,7,8,9};int (*p)[5];p = a;std::cout << "p = " << p << " and ";std::cout << "a = " << a<< '\n';std::cout << "p + 1 = "<< p + 1 << " and ";std::cout << "&(a[1]) = " << &(a[1]) << '\n';std::cout << "*p = " << *p << " and ";std::cout << "a[0] = "<< a[0] << '\n';std::cout << "*(p+1) = "<< *(p+1) << " and ";std::cout << "a[1] = "<< a[1] << '\n';std::cout << "**p = "<< **p << " and ";std::cout << "a[0][0] = "<< a[0][0]<< '\n';std::cout << "*(*p + 1) = "<< *(*p + 1) << " and ";std::cout << "a[0][1] = "<< a[0][1] << '\n';std::cout << "*(*(p + 1)) = "<< *(*(p + 1))<< " and ";std::cout << "a[1][0] = "<< a[1][0]<< '\n';std::cout << "*(*(p + 2) + 1) = "<< *(*(p + 2) + 1)<< " and ";std::cout << "a[2][1] = "<<a[2][1]<< '\n';std::cout << "*p = " << *p << " and ";std::cout <<"&(**p) = "<< &(**p) << '\n';getchar();
}

输出为:


下图中详细的描述了各级指针之间的关系,以及与数组之间的关系。

四、上述我们总结了二维数组与二维指针之间的关系,在此做一个记录,以备后续查看。

二维数组和指针之间的关系详解相关推荐

  1. 多维数组与指针之间的关系详解

    先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU看来内存是 ...

  2. 详解多维数组与指针之间的关系

    一维数组 先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU ...

  3. java二维数组元素_java二维数组,获取整行元素详解

    之前给大家讲过java二维数组获取单个元素方面的知识,下面的话就来给大家讲一下java二维数组获取整行元素方面的知识. 除去获取单个元素和全部元素之外,还可以单独获取二维数组的某一行中所有元素的值,或 ...

  4. C++ 二维数组和指针数组

    C++ 二维数组和指针数组 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年04月10日 二维数组大家都很清楚,就是该数组包含的元素是一个数组,那么和指针数组又 ...

  5. 二维数组及其指针基础

    编程学习-二维字符串数组的初始化-动态内存分配 动态内存分配 1.堆内存分配 : C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆 (heap)区或自由存 ...

  6. c++17(26)-数组、二维数组的指针、指向数组的指针、指向数组的指针的指针

    #include <iostream> #include <string.h> using namespace std;void setC1(int a[],int size) ...

  7. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  8. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  9. Python Numpy多维数组.sum(axis=0/1/2...) 详解

    Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...

最新文章

  1. 从URL输入到页面展现,过程中发生了什么?
  2. itext库产生word文档示例(.doc)
  3. 中断锁与信号量的一种使用场景
  4. Pytorch的网络结构可视化:Netron与TensorBoardX
  5. Python:通过远程监控用户输入来获取淘宝账号和密码的实验(二)
  6. Linux-使用之vim出现的问题
  7. 【Java】关键词梳理
  8. android gridview行分割线,Android中控件GridView实现设置行列分割线的方法示例
  9. 电动汽车真的省钱吗?
  10. NSAssert与assert断言
  11. mysql可以复用删除的记录吗_MySQL学习(八)删除表数据
  12. Github优质项目推荐(附国内Gitee地址)
  13. 项目经理面试的常见问题及面试技巧
  14. 【如何解决 Web 越来越繁杂的问题】笔记
  15. 基于长短期记忆网络(LSTM)的意见领袖对舆论风向的研究、网络暴力研究、LSTM情感分分类、意见领袖的影响力、神经网络实战、数据分析实战、蔡徐坤潘长江网络暴力事件、数据可视化实战、舆情研究
  16. 3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机
  17. Unity WebGL网页背景透明化(2021更新)
  18. 在普通maven项目应用中使用MQ
  19. 【SQL SERVER】将查询结果转换为字符串
  20. 欺诈团伙遇上关联网络,邪不压正

热门文章

  1. 深度学习实战1(基本概念、全连接神经网络、CNN)
  2. [源码和文档分享]基于蒙特卡洛信心上限搜索树UTC算法的四子棋游戏
  3. The Head and Neck Tumor Segmentation Using nnU-Net with Spatial and Channel ‘Squeeze Excitation’ B
  4. 小学生 计算机语言,五年级小学生自写编程语言“Panda”
  5. 2021年4月自考Java 试题
  6. 新零售的下半场在同城速递中燃起,闪送恐难挑起重担?
  7. Linux移动硬盘挂载常用操作
  8. android开发中dx.jar,Android Studio:无法加载dx.jar
  9. 手机火狐浏览器怎么开启flash_怎么启用Flash,怎么启动浏览器Flash
  10. C#串口编程 XML作为程序的配置文件