二维数组本质是也是线性存储的一维数组,各元素都是相对于基地址(首地址)的偏移,只是逻辑上的维度区分而已。或者可以理解为数组的数组,也就是说,n维数组的元素是一个n-1维数组。

需要注意的是,多维数组名与多维指针任何时候都不等价(除了一级指针可以直接用一维数组名赋值),但是,因为n维数组的元素是一个n-1维数组的关系。多维数组可以降维来处理,一个n维数组通过一个n-1维数组指针或指针数组(其元素的指针指向一个n-1维数组)或一级指针来处理。

1 二维数组与指针数组

二维数组在内存中是按照行优先的方式顺序存放的,所以二维数组我们可以理解为一维指针数组,每个指针元素分别指向二维数组的一行,这个一维指针数组的元素个数就是二维数组的行数:

int arr[ROW][COL];int* pa[ROW];for(i=0;i

2 二维数组与数组指针

在C中,n维数组名与n-1维数组指针等价,因为n维数组可以理解为n维数组的元素是一个n-1维的数组,且C中对多维数组是以行存储的,所以n维数组名可以直接赋值给一个n-1维数组指针:

 int arr[3][4]; int (*ap)[4]=arr;

这里arr是个二维数组的数组名,相当于一个二级指针常量,但二维数组名并不能赋值给二级指针,两者并不等价。

ap是一个指针变量,它指向包含4个int元素的一维数组,此时ap的增量以它所指向的一维数组长度为单位

*(ap+i)是一维数组arr[i][0]的地址,也就是二维数组第i行的首地址。

*(ap+2)+3表示arr[2][3]地址(第一行为0行,第一列为0列),*(*(ap+2)+3)表示arr[2][3]的值。

//(*ap)[4]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

以下写法等价:

arr[i][j]ap[i][j]*(*(arr+i)+j)*(*(ap+i)+j)

3 二维数组与一级指针

二维数组本质上线性存储的,而数组名指向了这块内存单元的首地址,如果用一个一级指针指向它,通过地址偏移便可以访问二维数组的全部元素:

 int arr[3][4];int* p = (int*)arr;p = &arr[0][0];  // 也可以直接指向其首元素

所以,二维数组可以通过一个数组指针、指针数组、一级指针来遍历:

源代码:

#include using namespace std;#define ROW 3#define COL 4int main(){    // 1 指针与数组    int ar[ROW],var;    // 数组名是一块内存的首地址    //ar = &var;        // 数组名是个常量,不能继续用做左值    int* arp = ar;       // 指针变量名有己址、己值,也有他址、他值、他型    arp= &var;          // 指针变量可随时用做左值        printf("%d,%d",sizeof(ar),sizeof(arp));    int arr[ROW][COL];    int i,j;    for(i=0; i

-End-

c++ 二维数组_C|数形结合理解数组指针、指针数组、一级指针来遍历二维数组相关推荐

  1. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...

  2. c语言三维数组 三维指针,C语言 通过指针访问一维数组,二维数组,三维数组。...

    /** 通过指针来访问一维数组,二维数组,多维数组 */ #include const int COLS=3; const int COUNT=4; //通过一级指针,计算偏移量来遍历一维数组 voi ...

  3. 【C语言】指针第二弹(指针数组、数组指针、数组传参)

    一. 指针数组 指针数组就是存放指针变量的数组,指针数组的本质是数组,而非指针. 1.1 定义和初始化 定义:int* arr[3]  //arr是存放整型指针的数组,包含3个元素 初始化:int* ...

  4. 什么是指针?什么是数组指针?什么是指针数组?

    今天来探讨一下关于指针的一些知识 1.指针 #include <stdio.h>#if 0 1.指针变量的定义数据类型* 变量名;注意事项: 1.在定义指定变量时,*起到标志性的作用, 除 ...

  5. (C语言)指针进阶(1)——字符指针、数组指针

    初识指针结束啦,从本期开始,正式进入指针进阶部分. 目录 一.字符指针 二.数组指针 回顾关于数组名的理解 一.字符指针 在指针的类型中,我们知道有一种指针类型为字符指针char* 思考以下代码的输出 ...

  6. 【BZOJ1062】糖果雨(NOI2008)-数形结合+二维树状数组

    测试地址:糖果雨 做法:本题需要用到数形结合+二维树状数组. 这题看上去非常没有思路,因此我们来一步一步整理一下思路. 首先,我们要发现线段的颜色互不相同,并且移动的速度相等,这就说明它们的运动是周期 ...

  7. C语言 二维数组行数和列数计算 - C语言零基础入门教程

    目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...

  8. c ++创建二维数组_C ++中的二维数组

    c ++创建二维数组 介绍 (Introduction) A two-dimensional array in C++ is the simplest form of a multi-dimensio ...

  9. char二维数组_C语言指针与数组详解

    指针与数组 指针可以与变量结合,也可以与数组结合使用.指针数组和数组指针是两个截然不同的概念,指针数组是一种数组,该数组存放的是一组变量的地址.数组指针是一个指针,表示该指针是指向数组的指针. 1.指 ...

最新文章

  1. python太慢了-python 读取大文件越来越慢
  2. matlab treeview,treeview控件
  3. LeetCode Algorithm 876. 链表的中间结点
  4. SAP UI渲染模式:客户端渲染 VS 服务器端渲染
  5. 我如何在20小时内为AWS ML专业课程做好准备并进行破解
  6. python 生成式,迭代器,生成器
  7. python-opencv学习第二章
  8. PHP中获取文件扩展名的N种方法
  9. php-fpm 进程数和 cpu,关于PHP的 PHP-FPM进程CPU 100%的分析和解决
  10. mysql查询当前用户下的表空间_oracle 如何查看当前用户的表空间名称
  11. ubuntu 12.04下gedit查看txt中文乱码解决办法
  12. nodejs注册为windows服务实现开机自启动
  13. 微信群怎么添加二狗机器人?
  14. osgEarth gpx文件 16.feature_gpx.earth
  15. Mysql主从同步及主从同步延迟解决方案
  16. cf的服务器型号,常用CF法兰的型号和尺寸表
  17. wps ppt word 双屏幕同时浏览技巧
  18. Premiere 初识PR
  19. EDI的含义及其重要性
  20. JAVA关于父亲节的代码_关于父亲节的祝福语

热门文章

  1. 前端面试之那些稀奇古怪的问题
  2. HTML中的几种空格
  3. Go语言中的字符和字符串
  4. ASP.NET刷新页面的六种方法(转) 包括在跳转的时候使用提示
  5. 正则表达式 查找以某些字符开始 某些字符结束的匹配项 解决之道
  6. # 语音信号处理基础(十)——梅尔倒谱系数
  7. [转载] numpy.minimum
  8. [转载] python 卷积_40 行 Python 代码,实现卷积特征可视化
  9. 高速收发器之8B/10B编码
  10. MySQL数据库中,将一个字段的值分割成多条数据显示