二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 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. 一篇文章了解_unittest

    1. 基本概念 2018年10月7日 星期日 11:39 unittest是python自带的单元测试框架,有时候又被称为"PyUnit",是python版本的JUint实现. 该 ...

  2. linux打包 压缩 解压tar常归操作

    tar 打包 tar -cvf 打包后路径和文件名.tar 需要打包的路径和文件压缩 tar -zcvf 打包后路径和文件名.tar.gz 需要打包的路径和文件解压 tar -xvf 包名 -C 路径 ...

  3. 查看 /var/log目录下文件个数 命令tree 、cut

    查看 /var/log目录下文件个数 方法1. [root@oldboy learn_shell]# tree -L 1 /var/log/ |tail -1 5 directories, 42 fi ...

  4. MyBatis学习02

    3.增删改查实现 select select标签是mybatis中最常用的标签之一 select语句有很多属性可以详细配置每一条SQL语句 SQL语句返回值类型.[完整的类名或者别名] 传入SQL语句 ...

  5. 已安装的nginx添加其他模块

    总体操作就是添加新模块并重新编译源码,然后把编译后的nginx可执行文件覆盖原来的那个即可.1 查看已安装的参数nginx -V拷贝那些巴拉巴拉的参数,后面编译的时候使用 2 下载相同版本号的源码,解 ...

  6. jQuery 第十章 ajax 什么是回调地狱 优化回调地狱

    回调地狱 什么是回调地狱,回调函数,一个嵌套着一个,到最后,缩略图成了 一个三角形, 造成了可阅读性差,可阅读性差就代表代码的可维护性 和 可迭代性差,最后还有一个就是可扩展性差. 也不符合设计模式的 ...

  7. sentinel--初级使用篇

    1.官方资料 github官网地址:https://github.com/alibaba/Sentinel wiki:https://github.com/alibaba/Sentinel/wiki/ ...

  8. 一张图彻底理解Spring如何解决循环依赖!!

    写在前面 最近,在看Spring源码,看到Spring解决循环依赖问题的源码时,不得不说,源码写的太烂了.像Spring这种顶级的项目源码,竟然存在着这种xxx的代码.看了几次都有点头大,相信很多小伙 ...

  9. vue中,模拟锚点定位,实现滚动动画效果

    平时我们利用锚点进行页面内的快速瞬移,画面跳转生硬,观感很差. 在VUE中,如何快速的实现锚点效果,并且还让它拥有滚动的动画效果呢. 其实两行代码就能解决问题 1 <a @click=" ...

  10. python - os.sep用法

    python是跨平台的.在Windows上,文件的路径分隔符是'\',在Linux上是'/'.为了让代码在不同的平台上都能运行,那么路径应该写'\'还是'/'呢?使用os.sep的话,就不用考虑这个了 ...