二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 nums 为例:

从概念上理解,nums 的分布像一个矩阵,但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存:

1     int nums[2][3] =  { 10,20,30,40,50,60 };
2 //以上定义与下边相同
3 int nums[2][3] = { {10,20,30}, {40,50,60} };

在几乎所有的程序语言中,二维数组都是按行排列的,先存放 nums[0] 行,再存放 nums[1] 行,最后存放 numsa[2] 行;

C 与 C++ 中 允许把一个二维数组分解成多个一维数组来处理。对于数组 nums,它可以分解成两个一维数组,即 nums[0]、nums[1],每一个一维数组又包含了 3 个元素,例如 nums[0] 包含 nums[0][0]、nums[0][1]、nums[0][2]

以下代码通过对指针进行移动,来查看指针运算后获得实际结果,你会发现数组指针加 * 取内容符前后打印内容一样,均为一个内存地址。这里要注意一点——数组名本身便是指针,但它不是指向数组的指针,是指向数组第一个元素的指针,指针前加*号后其实是取到了内容,但这个内容是这个数组元素的地址:

 1     int nums[2][3] =  { 10,20,30,40,50,60 };
2
3 int(*p)[3] = nums;
4
5 printf("p = %d\n", p ); // 指向第0行 第0个成员
6 printf("*p = %d\n", *p ); // 指向第0行 第0个成员,这里加 * 号,取的是数组指向元素的地址
7 printf("*(*p) = %d\n", *(*p) ); // 访问第0行 第0个成员的值
8 printf("p + 1 = %d\n", p + 1 ); // 指向第1行 第0个成员
9 printf("*(p + 1) = %d\n", *(p + 1) ); // 指向第1行 第0个成员,这里加 * 号,取的是数组指向元素的地址
10 printf("*(*(p + 1))= %d\n", *(*(p + 1)) ); // 访问第1行 第0个成员的值
11 printf("*(p + 1) + 1 = %d\n", *(p + 1) + 1 ); // 指向第1行 的第1个成员
12 printf("*(*(p + 1) + 1) = %d\n", *(*(p + 1) + 1) ); // 访问指向第1行的第1个成员的值

打印结果:

p = 2029920
*p = 2029920
*(*p) = 10
p + 1 = 2029932
*(p + 1) = 2029932
*(*(p + 1))= 40
*(p + 1) + 1 = 2029936
*(*(p + 1) + 1) = 50

C 与 C++ 中 指向二维数组的指针进行指针运算的更多相关文章

  1. c语言编程-----指向二维数组的指针

    c中如何返回一个指向二维数组的指针 #include <stdio.h> #include <stdlib.h> #define COUNT 3 typedef int (*M ...

  2. 一些Python中的二维数组的操作方法

    一些Python中的二维数组的操作方法 这篇文章主要介绍了一些Python中的二维数组的操作方法,是Python学习当中的基础知识,需要的朋友可以参考下 需要在程序中使用二维数组,网上找到一种这样的用 ...

  3. C#中读取二维数组每位的长度

    C#中的二维数组,如int[,] A=new int[a,b];则 a=A.GetLength(0);即可获得二维数组中第一维的长度. b=A.GetLength(1);即可获得二维数组中第二维的长度 ...

  4. Java中的二维数组

    Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空 ...

  5. iOS中的二维数组

    首先我们知道OC中是没有二维数组的,二维数组是通过一位数组的嵌套实现的,但是别忘了我们有字面量,实际上可以和C/C++类似的简洁地创建和使用二维数组.这里总结了创建二维数组的两种方法以及数组的访问方式 ...

  6. 在python中定义二维数组

    发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段代码 [py]array = [0, 0, 0 ...

  7. 如何在C中传递二维数组作为参数?

    回答: 在C语言中,有很多方法可以将2d数组作为参数传递.在下面的部分中,我描述了将2d数组作为参数传递给函数的几种方法. 使用指针传递2d数组以在c中运行 多维数组的第一个元素是另一个数组,所以在这 ...

  8. 详解c++中对二维数组下标[][]的重载

    首先定义一个矩阵类,我用一个二维数组存储矩阵中的数据,矩阵详细定义如下 class Matrix { public: Matrix(int rows, int cols) { _rows = rows ...

  9. php中遍历二维数组并以表格的形式输出

    一.索引数组 <?php //使用array()语句结构将联系人列表中所有数据声明为一个二维数组,默认下标是顺序数字索引 $contact1 = array( //定义外层数组 array(1, ...

随机推荐

  1. 'sortbitwise'是什么意思

    问题 flag sortbitwise 在ceph中是什么意思,在Jewel版本下可以看到多了这个flags [root@lab8106 current]# ceph -s cluster ffe7a ...

  2. 计算思维(美国CMU周以真教授)

    博主注:GIScience会议是国际上最为著名的地理信息系统领域的国际会议,自2000年起,每两年举办一次,GIScience 2008会议邀请了美国卡内基-梅隆大学(CMU)计算机系华裔教授周以真博 ...

  3. Vue知识点回顾(一)

    一.什么是vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不 ...

  4. springboot项目启动报错Communications link failure

    环境情况,MySQL版本如下: 报错情况如下(看上去是和数据库有关): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communi ...

  5. ABBYY FineReader 15 PDF文档编辑功能详解

    ABBYY FineReader 15(Windows系统)OCR文字识别软件作为一款通用 PDF 工具,能轻松有效地对各种 PDF文档和纸质文档,进行数字化.检索.编辑.转换.包含.分享和合作,而其 ...

  6. 紧急发布用cherry-pick检出当前分支所有我的提交记录

    目录 背景 操作命令 cherry-pick git log Shell脚本 背景 公司接了个新项目,需在平台上增加几个新接口,问题是本来说是和平台一起迭代发布的时间提前了,但当前的代码都和其他开发人 ...

  7. 在iOS中使用ZBar扫描二维码和条形码

    最近做了个外包项目,里面用到了二维码扫描和微信支付!之前比较熟悉的是ZXing,但是在Xcode7.1里面发现竟然莫名的不支持,木有办法,从网上查了一下还有一种支持二维码扫描的东西,没错就是接下来我要 ...

  8. F - LCS 题解(最长公共子序列记录路径)

    题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...

  9. 一道百度java面试题的多种解法

    下面是我在2018年10月11日二面百度的时候的一个问题: java程序,主进程需要等待多个子进程结束之后再执行后续的代码,有哪些方案可以实现? 这个需求其实我们在工作中经常会用到,比如用户下单一个产 ...

  10. 冲刺随笔——Day_Three

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...