二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 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. ceph bluestore的db分区应该预留多大的空间

    前言 关于bluestore的db应该预留多少空间,网上有很多资料 如果采用默认的 write_buffer_size=268435456 大小的话 那么几个rocksdb的数据等级是 L0: in ...

  2. eclipse 和 myeclipse 字符编码设置

    需要设置的几处地方为: Window->Preferences->General ->Content Type 所有 Default encoding 设置为UTF-8 Window ...

  3. ISITDTU CTF 2020 部分Web题目Writeup

    周末,跟着m3w师傅打ISITDTUCTF,m3w师傅带弟弟上分,Tql! Web1 给了源码: <?php class Read{ public $flag; public function ...

  4. Python 调用接口添加头信息

    import requests,jsonurl = 'http://47.108.115.193:9000/tb-store/store/getWechatAppHome'header={" ...

  5. 通过phpmyadmin拿下webshell

    废话: 1.听说网上卖手机的网站很多是诈骗的,搜到一个499元货到付款的手机网站.有点像诈骗,但倒觉得他是在收集用户信息 2.把网站扔到御剑,搜到phpmyadmin的后台,试试下账号密码居然都是默认 ...

  6. MathType中的条件概率的输入

    条件概率公式是高中数学的概率知识中比较常用的一个公式,今天我们来介绍一下在MathType中如何输入条件概率公式. 具体步骤如下: 步骤一 打开专业的公式编辑软件MathType 7,在输入框中输入& ...

  7. Thrift接口简介

    参考地址:http://roclinux.cn/?p=3316 [thrift是什么] 计算机技术里一款著名的通信框架 – thrift框架 thrift的全名叫做Apache thrift,是一款软 ...

  8. Java基础教程——Object类

    Object类 Object类是Java所有类类型的父类(或者说祖先类更合适) <Thinking in Java(Java编程思想)>的第一章名字就叫"everything i ...

  9. Springboot整合WebSocket实现网页版聊天,快来围观!

  10. 现代富文本编辑器Quill的内容渲染机制

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...