C++ 指针与二维数组名
和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,以下面的程序为例,二维数组名 array2d 和 &array2d[0] 等效,它们的类型都为 short (*)[5];对数组名应用地址运算符时,得到的是整个数组的地址,它的类型为 short (*)[5][5],假设 short 宽 2 字节,系统为 32 位,数组首地址为0x00BCF8FC,例子中几种表示的区别为:
- 数组名
array2d和&array2d[0]等效,类型都为short (*)[5],存储的是一个 10 字节内存块的地址,它们指向的对象是包含 5 个元素的short数组,但在运用sizeof()时,这两者会有区别,sizeof(array2d)=50而sizeof(&array2d[0])=4。 - 表示
&array2d的类型为short (*)[5][5],存储的是一个 50 字节内存块的地址,它指向的对象是 5 行 5 列的二维short数组。 - 表示
&array2d[0][0]和array2d[0]等效,类型都为short *,存储的是一个 2 字节内存块的地址,它指向的对象是short类型数据,但在运用sizeof()时,这两者会有区别,sizeof(&array2d[0][0])=4而sizeof(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++ 指针与二维数组名的更多相关文章
- C/C++二维数组名和二级指针
转载 :https://blog.csdn.net/wu_nan_nan/article/details/51741030 作者:吴一奇 1. 指针1.1 一个指针包含两方面:a) 地址值:b) 所 ...
- c语言,指针与数组--指针与二维数组2
指向一维数组的指针 char (*p)[10] ;指向一维数组的指针类型 typedef char(*TYPE_P2ARRAY)[10] ; 该指针可以指向数组 ,且使用起来效果节本相同, ...
- 论C语言中二级指针和二维数组之间的区别
刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...
- C++二维数组名的再探索
#include <iostream> int main() { ][] = { , , , , , , , , , , , }; //输出 0,1,2,3,4,5,6,7,8,9,10, ...
- C:指针遍历二维数组
C 指针遍历二维数组 http://blog.csdn.net/lcxandsfy/article/details/55000033 C++ 字符串指针与字符串数组 https://www.cnblo ...
- 20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag
1.为什么printf之后数组的值会改变? #include<stdio.h> ; int * Zigzag() { ,j=,limit=; ; ; int a[N][N]; int (* ...
- C语言数组篇(五)多级指针和二维数组指针的区别
多级指针 以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[] --> 10个空间的数组 * p[] --> 这10个空间的数组里面存放 ...
- 唠唠C++二级指针、二维数组、指针数组、数组指针等的区分
今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘. 二级指针: int **p; 二维数组: int p[10][10]; char q[10][ ...
- C指针与二维数组
先贴上完整的代码: #include<stdio.h> int main(int argc, char *argv[]){ int a[3] [5]={1,2,3,4,5,6,7,8,9, ...
随机推荐
- FS2K人脸素描属性识别
人脸素描属性识别 代码:https://github.com/linkcao/FS2K_extract 问题分析 需要根据FS2K数据集进行训练和测试,实现输入一张图片,输出该图片的属性特征信息,提取 ...
- Navicat中查询mysql版本
SELECT VERSION( ) FROM DUAL
- 图文带你看懂JavaScritpt引擎V8与JS执行过程
浏览器原理 浏览器内核与js引擎 浏览器内核又称"排版引擎","渲染引擎","浏览器引擎",叫法很多,简单来说干的活就是将代码(HTML,X ...
- while循环--和do-while循环
对于循环语句来说他会有一个回上去的箭头,这个回上去的箭头就形成了一个重复做的事情,那种重复做的事情我们就叫做循环 while循环 ~如果我们把while翻译作"当",那么一个whi ...
- 基于 Rainbond 部署 DolphinScheduler 高可用集群
本文描述通过 Rainbond 云原生应用管理平台 一键部署高可用的 DolphinScheduler 集群,这种方式适合给不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kub ...
- [ERROR] Another process with pid 914 is using unix socket file.
mysql启动报错 1.首先到mysql的配置文件中,确定socket文件路径 vim /etc/my.cnf 2.删除mysql.sock.lock 3.启动mysql
- 4-7 CS后台项目练习-1
1. 关于此项目 此项目是一个自营性质电商类型的项目. 当前目标是设计后台管理相关功能. 2. 关于项目的开发流程 开发项目的标准流程应该有:需求分析.可行性分析.总体设计.详细设计等. 建议课后学习 ...
- linux学习(小白篇)
当前服务器:centos 7 shell命令框:xshell 文件预览及上传:xftp (界面化软件,非常好用) 数据库连接:navicat 此文是在学习linux时做一个指令合集,方便自己查阅 进文 ...
- Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript来打造属于自己的个性化社交分享系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_143 每一个应用程序,其实都会有分享的需求,比如一键分享一篇文章或者一些活动到微博或者微信亦或者是twitter等社交平台,因为人 ...
- 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_132 最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用 ...