二维数组和指针之间的关系详解
一、引言
说起二维数组可能首先想到的是各种嵌套的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();
}
输出为:
下图中详细的描述了各级指针之间的关系,以及与数组之间的关系。
四、上述我们总结了二维数组与二维指针之间的关系,在此做一个记录,以备后续查看。
二维数组和指针之间的关系详解相关推荐
- 多维数组与指针之间的关系详解
先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU看来内存是 ...
- 详解多维数组与指针之间的关系
一维数组 先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU ...
- java二维数组元素_java二维数组,获取整行元素详解
之前给大家讲过java二维数组获取单个元素方面的知识,下面的话就来给大家讲一下java二维数组获取整行元素方面的知识. 除去获取单个元素和全部元素之外,还可以单独获取二维数组的某一行中所有元素的值,或 ...
- C++ 二维数组和指针数组
C++ 二维数组和指针数组 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年04月10日 二维数组大家都很清楚,就是该数组包含的元素是一个数组,那么和指针数组又 ...
- 二维数组及其指针基础
编程学习-二维字符串数组的初始化-动态内存分配 动态内存分配 1.堆内存分配 : C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆 (heap)区或自由存 ...
- c++17(26)-数组、二维数组的指针、指向数组的指针、指向数组的指针的指针
#include <iostream> #include <string.h> using namespace std;void setC1(int a[],int size) ...
- c++如何打印一维数组首地址_C语言之二维数组和指针的结合
最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...
- c语言二维数组 ppt,C语言二维数组与指针.ppt
C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...
- Python Numpy多维数组.sum(axis=0/1/2...) 详解
Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...
最新文章
- 从URL输入到页面展现,过程中发生了什么?
- itext库产生word文档示例(.doc)
- 中断锁与信号量的一种使用场景
- Pytorch的网络结构可视化:Netron与TensorBoardX
- Python:通过远程监控用户输入来获取淘宝账号和密码的实验(二)
- Linux-使用之vim出现的问题
- 【Java】关键词梳理
- android gridview行分割线,Android中控件GridView实现设置行列分割线的方法示例
- 电动汽车真的省钱吗?
- NSAssert与assert断言
- mysql可以复用删除的记录吗_MySQL学习(八)删除表数据
- Github优质项目推荐(附国内Gitee地址)
- 项目经理面试的常见问题及面试技巧
- 【如何解决 Web 越来越繁杂的问题】笔记
- 基于长短期记忆网络(LSTM)的意见领袖对舆论风向的研究、网络暴力研究、LSTM情感分分类、意见领袖的影响力、神经网络实战、数据分析实战、蔡徐坤潘长江网络暴力事件、数据可视化实战、舆情研究
- 3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机
- Unity WebGL网页背景透明化(2021更新)
- 在普通maven项目应用中使用MQ
- 【SQL SERVER】将查询结果转换为字符串
- 欺诈团伙遇上关联网络,邪不压正
热门文章
- 深度学习实战1(基本概念、全连接神经网络、CNN)
- [源码和文档分享]基于蒙特卡洛信心上限搜索树UTC算法的四子棋游戏
- The Head and Neck Tumor Segmentation Using nnU-Net with Spatial and Channel ‘Squeeze Excitation’ B
- 小学生 计算机语言,五年级小学生自写编程语言“Panda”
- 2021年4月自考Java 试题
- 新零售的下半场在同城速递中燃起,闪送恐难挑起重担?
- Linux移动硬盘挂载常用操作
- android开发中dx.jar,Android Studio:无法加载dx.jar
- 手机火狐浏览器怎么开启flash_怎么启用Flash,怎么启动浏览器Flash
- C#串口编程 XML作为程序的配置文件