二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 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. yum安装指定版本ceph包

    安装ceph包的方式有很多,这里讲的是从官网直接通过yum源的安装方式进行安装 yum源对应的地址为 http://download.ceph.com/rpm-hammer/el6/x86_64/ 怎 ...

  2. Function(函数分享)第二节

    一.类型注解 1.1 类型注解 函数的类型注解分为两个部分:参数类型注解和返回值类型注解.其中返回值类型注解有时候我们可以直接省略,因为Typescript可以根据返回的语句来自动判断出返回值的类型. ...

  3. 协程实现socket并发编程

    在python中多线程其实是被弱化了,因为由于GIL的原因,同一时间只有一个线程能访问CPU,即使你的CPU是多核的在python中因为多线程被弱化了,所以协程显的重要,能够在一个线程中提高CPU的利 ...

  4. WeihanLi.Npoi 1.13.0 更新日志

    WeihanLi.Npoi 1.13.0 更新日志 Intro 在 Github 上收到 Issue 收到网友反馈希望支持自动分 Sheet 导出,有兴趣的可以参考 Issue https://git ...

  5. [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

  6. div定时放大缩小

    <!DOCTYPE html> <html> <head> <style> .anim{ width: 100px; height: 100px; ba ...

  7. 分布式监控系统之Zabbix主动、被动及web监控

    前文我们了解了zabbix的网络发现功能,以及结合action实现自动发现主机并将主机添加到zabbix hosts中,链接指定模板进行监控:回顾请参考https://www.cnblogs.com/ ...

  8. (在模仿中精进数据可视化05)疫情期间市值增长top25公司

    本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/FefferyViz 1 简介 新冠疫情对很多实体经济带来冲击的同时,也给很多公司带来了新的增长 ...

  9. qsort的cmp函数理解

    qsort使用 近期频繁使用qsort函数,但是对于cmp函数却一直不太熟悉,现用现查.故写一篇小笔记记录一下. 函数原型: void qsort(void *base,size_t NumEle,s ...

  10. TeXstudio 2020显示行号(与之前的版本位置不太一样)