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

开发工具与关键技术:C++、VisualStudio
作者:何任贤
撰写时间:2019年04月10日
二维数组大家都很清楚,就是该数组包含的元素是一个数组,那么和指针数组又有什么关系呢?那么我先解释一下指针数组是什么东西。

首先指针和普通的变量是用来存放东西的,普通变量呢存放的是值,就是普通的值,而指针存放的是地址,那么大家都是存放东西,你可以建立数组存放,那么指针也可以,指针也可以建立数组存放多个地址,然后我们先看它们的代码和结果,再来解析它们的不同之处。
二维数组:
void main()
{
int j = 0;
int a[3][3];
for (int i = 0; i < 3; i++)
{
for (int n = 0 ; n < 3 ; n++, j++)
{
a[i][n] = j;
}
}
for (size_t i = 0; i < 3; i++)
{
for (size_t n = 0; n < 3; n++)
{
cout << a[i][n] << " ";
}
}
cout << “\n”;
}

这是一个二维数组的赋值和输出那么上面指针也是可以达到二维数组的效果的,那么它要怎么实现呢?它和二维数组又有什么不同?
指针数组:
void main()
{
int c[2] = { 0,1 }, e[3] = { 2,3,4 }, f[4] = {5,6,7,8};
int *b[3];
b[0] = c;
b[1] = e;
b[2] = f;
for (size_t i = 0; i < 2; i++)
{
cout << *(b[0]+ i) << " ";
}
for (size_t i = 0; i < 3; i++)
{
cout << *(b[1] + i) << " ";
}
for (size_t i = 0; i < 4; i++)
{
cout << *(b[2] + i) << " ";
}
cout << “\n”;
}

虽然结果是一样的但是可以明显的发现二维数组做不到的事情,但是指针数组可以从代码中我们发现第一指针数组存放的是地址,只有声明过的变量才能找到它的地址,那么指针数组指向的地址必须是声明过的,但是二维数组不同,二维数组存放的元素虽然是数组但是那是没有标识的数组,指针数组存放的是地址,数组的地址那么肯定是有标识,

而且因为指针数组的存放的是地址,那么不同长度的数组的地址都是可以给指针数组保存的,而二维数组不行,因为二维数组在声明时,就已经把它存放的数组的长度给固定了,是不可以改变的,指针可以达到存放不同长度的数组的效果,但是它和二维数组不同,二维数组的内存也是连续的,而指针数组的不是,所以指针数组就达不到通过地址加减来获取数组里面存放的元素。
这就是二维数组和指针数组的不同之处,各有各的优势和劣势,我们也就可以根据自己需求来选择。

C++ 二维数组和指针数组相关推荐

  1. C和指针之二维字符串数组用指针数组、数组指针、二级指针打印

    1.问题 二位字符串数组用指针数组.数组指针.二级指针打印       2.测试代码 #include <stdio.h>int main() {char value[4][5] = {& ...

  2. 间接通过new 来申请一个二维的堆内存数组

    我们知道无法直接通过new 来申请一个二维的堆内存数组,于是有人想出了这样一个办法:创建一个一维堆内存指针数组,即每个数组元素是一个指针,然后用new 给各个指针分配一个一维的堆内存数组,那么最后表示 ...

  3. HDU2642(二维的树状数组)

    二维的树状数组,我记得是模版!^ _ ^ 题意很清楚:就是这部分的原理:sum(x1,y1)+sum(x2-1,y2-1)-sum(x1,y2-1)-sum(x2-1,y1);其实可以和概率论中的一个 ...

  4. matlab 三维数组运算,MATLAB二维三维画图仿真数组运算

    MATLAB二维三维画图仿真数组运算 1. 数学 (1) 数组运算: x=[1 2 3 4]; y=[3 4 5 6]; z=x+y %数组x与数组y相加得到数组z z = 4 6 8 10 z=x- ...

  5. 关于图的二维矩阵转为一维数组的理解。

    一开始看二维矩阵转为一维数组的时候还是有点懵的,为啥是N(N+1)/2呢,为啥不是N*N/2呢,这个矩阵明明是N*N的一个正方形啊,我要省一半空间直接除2不就行了,带着这个问题我观察了一下这个PPT里 ...

  6. C/C++:Windows编程—Windows RPC 传递自定义数据类型、自定义数据类型数组、指针数组

    前言 该篇博文不是讲Windows rpc入门的.是笔者在实际使用Windows RPC时 所遇到的问题,以及解决方法. 笔者有这样的需求,需要从RPC Server获取大量数据,而且该数据是动态分配 ...

  7. 二级指针、数组指针、二维数组、指针数组作为函数形参时可传入的实参

    1.传参规则: a.当二级指针作为函数形参时,能作为函数实参的是二级指针,指针数组,一级指针的地址 b.当数组指针作为函数形参时,能作为函数实参的是二维数组,数组指针 c.当二维数组作为函数形参时,能 ...

  8. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  9. 二维(字符)数组输入(转载)

    对于二维数组的输入,一般是一行一行的输入,当然也可以一个个来,但最好还是一行一行的输入. 所以一行一行的输入: for(int i= 0;i < N;i++)         scanf(&qu ...

最新文章

  1. iOS 解决1。返回时的黑边问题、2。controller的抖动问题
  2. C# Task 循环任务_理解C#中的ValueTask
  3. CentOS 6.x安装配置MongoDB 3.4.x
  4. 谈谈你对IOC的理解
  5. java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...
  6. java拼装树_java 数据拼装成树结构
  7. 一步一步写算法(之链表逆转)
  8. 力排众议,自由软件之父 RMS 正式回归 FSF!
  9. 遥感、GIS及GPS 土壤普查、制图及土壤空间数据分析
  10. 常见的Markdownpad2运行破解以及This view has crashed!报错和Awesomium1.6.6SDK安装使用
  11. 网络安全技术及应用复习材料
  12. 智能POS删除文件和数据库操作步骤
  13. 关于win8.1系统的网络用一段时间就会受限的原因及解决方法
  14. MySQL索引、视图创建与管理操作实验
  15. python股票数据简单分析
  16. 动态条形图展示人均GDP,最后以gif格式输出
  17. 海量智库第5期|Vastbase G100核心技术介绍之「SQL by pass技术」
  18. 现代社会,各行各业的竞争越来越激烈
  19. 央企数字化服务转型之道
  20. 数字炸弹(shell)

热门文章

  1. 用 CSS 做轮播图
  2. css3中clip属性
  3. 3D 服务器端以向量计算为主的角色位置的算法
  4. 【字符串系列】字符串匹配中的位并行算法
  5. (转)Cairngorm初学者入门教程 第四节--通过 Model Locator 控制管理 Views
  6. 草根版创业网站学巴菲特售时间 获天使投资
  7. 谈Tensorflow的Batch Normalization
  8. Deep Learning学习 之 CNN代码解析(MATLAB)
  9. Markdown:数学公式(4)
  10. stm32 中bootloader、startup_stm32f10x_md.s的作用