和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,以下面的程序为例,二维数组名 array2d&array2d[0] 等效,它们的类型都为 short (*)[5];对数组名应用地址运算符时,得到的是整个数组的地址,它的类型为 short (*)[5][5],假设 short 宽 2 字节,系统为 32 位,数组首地址为0x00BCF8FC,例子中几种表示的区别为:

  • 数组名 array2d&array2d[0] 等效,类型都为 short (*)[5],存储的是一个 10 字节内存块的地址,它们指向的对象是包含 5 个元素的 short 数组,但在运用 sizeof() 时,这两者会有区别,sizeof(array2d)=50sizeof(&array2d[0])=4
  • 表示 &array2d 的类型为 short (*)[5][5],存储的是一个 50 字节内存块的地址,它指向的对象是 5 行 5 列的二维 short 数组。
  • 表示 &array2d[0][0]array2d[0] 等效,类型都为 short *,存储的是一个 2 字节内存块的地址,它指向的对象是 short 类型数据,但在运用 sizeof() 时,这两者会有区别,sizeof(&array2d[0][0])=4sizeof(array2d[0])=10
  • 类型 short **,存储的是一个 4 字节内存块的地址,它指向的对象是 short* 类型数据。
//声明并初始化数组
short array2d[5][5] = {{5,2,8,4,1},
{2,2,4,6,8},
{1,5,8,9,4},
{5,7,6,2,5},
{7,6,5,8,1}}; //声明并初始化指针一:以下几种赋值结果对ptra等效
short (*ptra)[5] = array2d; //方式一:值为0x00BCF8FC
short (*ptra)[5] = &array2d[0]; //方式二:值为0x00BCF8FC //声明并初始化指针二
short (*ptrb)[5][5] = &array2d; //值为0x00BCF8FC //声明并初始化指针三:以下几种赋值结果对ptrc等效
short *ptrc = &array2d[0][0]; //方式一:值为0x00BCF8FC
short *ptrc = array2d[0]; //方式二:值为0x00BCF8FC //声明并初始化指针四:以下几种赋值结果对ptrd等效
short *ptrTmp[5] = {array2d[0],array2d[1],array2d[2],array2d[3],array2d[4]};
short** ptrd = ptrTmp; //方式一:值为0x00BCF8A4
short** ptrd = new short*[5]{
array2d[0],
array2d[1],
array2d[2],
array2d[3],
array2d[4]}; //方式二:值为0x01156470,需配合使用delete[]释放内存
short** ptrd = new short*[5]();
ptrd[0] = array2d[0];
ptrd[1] = array2d[1];
ptrd[2] = array2d[2];
ptrd[3] = array2d[3];
ptrd[4] = array2d[4]; //方式三:值为0x01046AE0,需配合使用delete[]释放内存 //访问数组第3行第4列的元素
cout << array2d[2][3]; //结果为9
cout << *(array2d[2]+3); //结果为9
cout << *(*(array2d+2)+3);//结果为9 cout << ptra[2][3]; //结果为9
cout << *(ptra[2]+3); //结果为9
cout << *(*(ptra+2)+3); //结果为9 cout << (*ptrb)[2][3]; //结果为9
cout << *((*ptrb)[2]+3);//结果为9
cout << *(*(*ptrb+2)+3);//结果为9 cout << ptrc[2*5+3]; //结果为9
cout << *(ptrc+2*5+3); //结果为9 cout << ptrd[2][3]; //结果为9
cout << *(ptrd[2]+3); //结果为9
cout << *(*(ptrd+2)+3); //结果为9 //应用指针算术时单位1表示的字节数
cout << int(array2d+1)-int(array2d); //结果为10
cout << int(&array2d[0]+1)-int(&array2d[0]); //结果为10
cout << int(&array2d+1)-int(&array2d); //结果为50
cout << int(&array2d[0][0]+1)-int(&array2d[0][0]);//结果为2
cout << int(array2d[0]+1)-int(array2d[0]); //结果为2 cout << int(ptra+1)-int(ptra); //结果为10
cout << int(ptrb+1)-int(ptrb); //结果为50
cout << int(ptrc+1)-int(ptrc); //结果为2
cout << int(ptrd+1)-int(ptrd); //结果为4 //应用sizeof()获得内存量大小
cout << sizeof(array2d); //结果为50
cout << sizeof(&array2d[0]); //结果为4
cout << sizeof(&array2d); //结果为4
cout << sizeof(&array2d[0][0]);//结果为4
cout << sizeof(array2d[0]); //结果为10
cout << sizeof(array2d[0][0]); //结果为2 cout << sizeof(ptra); //结果为4
cout << sizeof(ptrb); //结果为4
cout << sizeof(ptrc); //结果为4
cout << sizeof(ptrd); //结果为4

C++ 指针与二维数组名的更多相关文章

  1. C/C++二维数组名和二级指针

    转载 :https://blog.csdn.net/wu_nan_nan/article/details/51741030  作者:吴一奇 1. 指针1.1 一个指针包含两方面:a) 地址值:b) 所 ...

  2. c语言,指针与数组--指针与二维数组2

    指向一维数组的指针   char (*p)[10] ;指向一维数组的指针类型 typedef  char(*TYPE_P2ARRAY)[10]  ;   该指针可以指向数组 ,且使用起来效果节本相同, ...

  3. 论C语言中二级指针和二维数组之间的区别

    刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...

  4. C++二维数组名的再探索

    #include <iostream> int main() { ][] = { , , , , , , , , , , , }; //输出 0,1,2,3,4,5,6,7,8,9,10, ...

  5. C:指针遍历二维数组

    C 指针遍历二维数组 http://blog.csdn.net/lcxandsfy/article/details/55000033 C++ 字符串指针与字符串数组 https://www.cnblo ...

  6. 20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag

    1.为什么printf之后数组的值会改变? #include<stdio.h> ; int * Zigzag() { ,j=,limit=; ; ; int a[N][N]; int (* ...

  7. C语言数组篇(五)多级指针和二维数组指针的区别

    多级指针   以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[] --> 10个空间的数组 * p[] --> 这10个空间的数组里面存放 ...

  8. 唠唠C++二级指针、二维数组、指针数组、数组指针等的区分

    今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘. 二级指针: int **p; 二维数组: int p[10][10]; char q[10][ ...

  9. C指针与二维数组

    先贴上完整的代码: #include<stdio.h> int main(int argc, char *argv[]){ int a[3] [5]={1,2,3,4,5,6,7,8,9, ...

随机推荐

  1. leetcode教程系列——Binary Tree

    tree是一种常用的数据结构用来模拟真实物理世界里树的层级结构.每个tree有一个根(root)节点和指向其他节点的叶子(leaf)节点.从graph的角度看,tree也可以看作是有N个节点和N-1个 ...

  2. dubbo(九):timeout超时机制解析

    在网络请求时,总会有各种异常情况出现,我们需要提前处理这种情况.在完善的rpc组件dubbo中,自然是不会少了这一层东西的.我们只需要通过一些简单的配置就可以达到超时限制的作用了. dubbo的设计理 ...

  3. 分布式事务(Seata)原理 详解篇,建议收藏

    前言 在之前的系列中,我们讲解了关于Seata基本介绍和实际应用,今天带来的这篇,就给大家分析一下Seata的源码是如何一步一步实现的.读源码的时候我们需要俯瞰起全貌,不要去扣一个一个的细节,这样我们 ...

  4. 【docker专栏6】详解docker容器状态转换管理命令

    docker容器有三种状态运行.停止.暂停,镜像可以创建.运行容器,镜像和容器也可以转换成tar压缩包进行存储.本文为大家介绍容器的状态转换命令及镜像创建运行容器.tar包导入导出相关的命令及使用场景 ...

  5. Kafka启动遇到ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)

    ------------恢复内容开始------------ Kafka启动遇到ERROR Exiting Kafka due to fatal exception (kafka.Kafka$) 解决 ...

  6. [System.OutOfMemoryException] {函数求值已禁用,因为出现内存不足异常。

    [System.OutOfMemoryException] {函数求值已禁用,因为出现内存不足异常. StringBuilder 赋值的时候超过内存的大小,要即时去清空文本的值. 也可能是DataSe ...

  7. noi-2.2基本算法之递归和自调用函数:放苹果

    先看一下题目: http://noi.openjudge.cn/ch0202/666/http://noi.openjudge.cn/ch0202/666/ 把M个同样的苹果放在N个同样的盘子里,允许 ...

  8. 【Azure 事件中心】Azure Event Hub 新功能尝试 -- 异地灾难恢复 (Geo-Disaster Recovery)

    问题描述 关于Event Hub(事件中心)的灾备方案,大多数就是新建另外一个备用的Event Hub,当主Event Hub出现不可用的情况时,就需要切换到备Event Hub上. 而在切换的过程中 ...

  9. Linux串口编程进阶

    在<Linux串口编程>编程一文中介绍了串口应用中常用的基本操作,如:串口打开关闭.串口设置.数据收发等.本篇文章主要基于常规串口操作进行了扩充,主要介绍如下操作: Linux系统使用非标 ...

  10. Mybatis源码解读-插件

    插件允许对Mybatis的四大对象(Executor.ParameterHandler.ResultSetHandler.StatementHandler)进行拦截 问题 Mybatis插件的注册顺序 ...