二维数组指针

概括的说,指针其实就是可变数组的首地址,说是可变数组,是
指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充
分节约宝贵的内存资源。我一向喜欢一维数组,除非万不得已,我一
般是不用二维数组的,多维的则更是很少涉足了。因为一维简单,容
易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更
具有讨论的必要。
闲话少说,这里我就以三个二维数组的比较来展开讨论:
(1)、int **Ptr;
(2)、int *Ptr[ 5 ];
(3)、int ( *Ptr )[ 5 ];
以上三例都是整数的二维数组,都可以用形如 Ptr[ 1 ][ 1 ] 的
方式访问其内容;但它们的差别却是很大的。下面我从四个方面对它们
进行讨论:
一、内容:
它们本身都是指针,它们的最终内容都是整数。注意我这里说
的是最终内容,而不是中间内容,比如你写 Ptr[ 0 ],对于三者来说,
其内容都是一个整数指针,即 int *;Ptr[ 1 ][ 1 ] 这样的形式才
是其最终内容。
二、意义:
(1)、int **Ptr 表示指向"一群"指向整数的指针的指针。
(2)、int *Ptr[ 5 ] 表示指向 5 个指向整数的指针的指针。
(3)、int ( *Ptr )[ 5 ] 表示指向"一群"指向 5 个整数数
组的指针的指针。
三、所占空间:
(1)、int **Ptr 和 (3)、int ( *Ptr )[ 5 ] 一样,在32位平
台里,都是4字节,即一个指针。
但 (2)、int *Ptr[ 5 ] 不同,它是 5 个指针,它占5 * 4 = 20
个字节的内存空间。
四、用法:
(1)、int **Ptr
因为是指针的指针,需要两次内存分配才能使用其最终内容。首
先,Ptr = ( int ** )new int *[ 5 ];这样分配好了以后,它和(2)的
意义相同了;然后要分别对 5 个指针进行内存分配,例如:
Ptr[ 0 ] = new int[ 20 ];
它表示为第 0 个指针分配 20 个整数,分配好以后, Ptr[ 0 ] 为指
向 20 个整数的数组。这时可以使用下标用法 Ptr[ 0 ][ 0 ] 到
Ptr[ 0 ][ 19 ] 了。
如果没有第一次内存分配,该 Ptr 是个"野"指针,是不能使用
的,如果没有第二次内存分配,则 Ptr[ 0 ] 等也是个"野"指针,也
是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外
的用法(类似于"借鸡生蛋"的做法),这里不作讨论(下同)。
(2)、int *Ptr[ 5 ]
这样定义的话,编译器已经为它分配了 5 个指针的空间,这相当
于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次
内存分配的。否则就是"野"指针。
(3)、int ( *Ptr )[ 5 ]
这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,
也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是"一群"
指针,每个指针都是指向一个 5 个整数的数组。如果想分配 k 个指针,
这样写: Ptr = ( int ( * )[ 5 ] ) new int[ sizeof( int ) * 5 * k ]。
这是一次性的内存分配。分配好以后,Ptr 指向一片连续的地址空间,
其中 Ptr[ 0 ] 指向第 0 个 5 个整数数组的首地址,Ptr[ 1 ] 指向第
1 个 5 个整数数组的首地址。
综上所述,我觉得可以这样理解它们:
int ** Ptr <=> int Ptr[ x ][ y ];
int *Ptr[ 5 ] <=> int Ptr[ 5 ][ x ];
int ( *Ptr )[ 5 ] <=> int Ptr[ x ][ 5 ];
这里 x 和 y 是表示若干的意思。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运动并不是最好的减肥办法,控制饮食也不是

运动并不是最好的减肥办法&#xff0c;控制饮食也不是。 两者的<有机>结合&#xff0c;才是最好的减肥法。 其实&#xff0c;可以把减肥当作一个体系&#xff1a;这个体系里&#xff0c;有进有出。 摄入过多&#xff0c;排出不够&#xff0c;便是我大多数朋友——也许…

ONVIF Device Manager修改设备密码

这个onvif工具可以实时监控画面&#xff0c;使用起来简单方便 左侧一栏是设备信息&#xff0c;中间上半部分是设备配置设置&#xff0c;下半部分是图像预览配置设置。 修改密码可通过该工具&#xff0c;点击User management后选择用户类型并且修改密码。

《 图解 TCP/IP 》读书笔记

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. WAN &#xff1a;Wide Area Network 广域网。 LAN &#xff1a; Local Area Network 局域网。 2. TCP/IP 是通信协议的统称。 3. C…

mysql 数据库函数入门

转载于:https://www.cnblogs.com/hwgok/p/10816922.html

函数中的apply,call入门介绍

###函数中的apply,call入门 牵扯到apply,call就要先说一下它们和函数的渊源 Javascript函数既是也是对象 它和其它的javascript对象没有什么区别。并且每个函数都包含两个非继承而来的方法 apply()和call(),这两个方法都可以间接的调用函数 例如: function f() {console.log(1)…

H.264入门级概念之I、B、P帧

MPEG压缩中的 I、B、P帧 首先,MPEG-1压缩的基本思想:帧内压缩和帧间压缩。 其次,时间相关性的统计分析:统计的结果表明,在间隔1~2帧的图像中,各像素只有10%以下的点,其亮度差值变化超过2%,而色度差值的变化只有1%以下。 采用的压缩方法: 分组:把几帧图像分为一组(GOP),为防止…

亚洲第二富豪吕志和的“双赢”人生

亚洲第二富豪“香港石矿大王”吕志和&#xff0c;作为香港四大传奇富商之一&#xff0c;由于行事低调&#xff0c;鲜少接受媒体访问&#xff0c;使他更富有商界传奇色彩。 在多年的经营发展中&#xff0c;吕志和秉承真诚守信&#xff0c;互惠共存的商业信条&#xff0c;助他闯…

《 第一本Docker书 》读书笔记 --- Docker 各项操作命令及参数说明(docker run 命令各个参数说明)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS &#xff1a;个人所有读书笔记只记录个人想要的内容&#xff0c;很可能原书大量内容没有纳入笔记中... ... 1. 可用 docker info 查…

配置u-boot的ip、网卡ip的命令

配置u-boot的ip地址&#xff1a; 串口连接设备&#xff0c;重启读秒时快速回车进入u-boot&#xff1a; setenv serverip 192.168.x.x 配置PC段连接的IP. setenv ipaddr 192.168.x.x 配置板子的.配置网卡ip(临时) 设备端终端&#xff1a; # ifconfig eth0 192.168.1.155 net…

Hadoop localhost: frankxulei@localhost: Permission denied (publickey,password)

Hadoop启动HDFS进程的时候报错&#xff0c;提示权限不够&#xff0c;具体信息如图所示&#xff1a;localhost: frankxuleilocalhost: Permission denied (publickey,password). frankxuleiubuntu:/usr/local/hadoop$ sbin/start-all.shWARNING: Attempting to start all Apache…

解决: java.net.ConnectException: Connection refused: connect

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 java.net.ConnectException: Connection refused: connect 1. 报错如上。 2. 原因和解决&#xff1a; 1&#xff09;端口号被占用&…

大富由天定,小富靠算计!

没有人愿意自己越过越穷&#xff0c;但是相信还是有很多人对自己的财务状况一头雾水。 如果要给现在的流行词汇做一个排行榜&#xff0c;相信“理财”肯定位列其中。 不管钱多钱少&#xff0c;拥有更多的财富是每个人的追求目标。 但认识误区还是不少&#xff0c; 比如&am…

几个sql案例

第一题 select Case When t.flag>0 Then "T" Else "F" End from (SELECT instr(TableA.col1,TableA.col2) as flag from TableA) t第三题 select s.* from student s ,(SELECT name,MAX(score) m from student GROUP BY name) t where s.name t.n…

京东购物在微信等场景下的算法应用实践

本文根据京东微信手Q业务部马老师在京东\u0026amp;DataFun Talk算法架构系列活动中所分享的《京东购物在微信等场景下的算法应用实践》编辑整理而成&#xff0c;在未改变原意的基础上稍做修改。此次分享的是以WQ&#xff08;微信手Q&#xff09;购物智能推荐系统介绍智能推荐算…

va_list/va_start/va_end的使用

va_list 键入以保存有关变量参数的信息 va_start 初始化变量参数列表 初始化ap以检索参数paramN后面的附加参数。 调用va_start的函数在返回之前也应调用va_end。 参数不能是引用类型&#xff0c;也不能是与传递没有参数的参数时产生的类型不兼容的类型。 /* va_start examp…

docker save 与 docker export 的区别

缘起 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 docker save和docker export都能导出镜像包&#xff0c;咋看起来区别似乎不大。本文就针对这个问题&#xff0c;试图搞清楚docker…

这5种员工,千万不能重用

一、道德品质存在缺陷之人不能用。 &#xff08;小人不能用&#xff09; 当今社会&#xff0c;我们在评论一个人的好坏时&#xff0c;首先看到的是他的道德素养。这方面界定这个人的为人本质。一个道德本质不行、差的人&#xff0c;我们统称为小人。小人的本质表现为&#xff…

docker:安装mysql多个

Docker 容器镜像删除 docker commit了一个镜像之后想删除旧的镜像&#xff0c;出现以下报错 Error response from daemon: conflict: unable to delete 6f8214d56bfc (cannot be forced) - image has dependent child images 解决思路&#xff1a; docker save保存容器 docker …

PS图片后期之超简易造光调色方法

技法是死的&#xff0c;而人是活的&#xff0c;说的简单一点就是我们要学会开拓一下思维&#xff0c;调色的方法并不是只有【可选颜色】而已。 在修片之前&#xff0c;我们先要学会分析&#xff0c;在拍摄这一组照片时我希望有一种夕阳的光穿透晒在脸庞的感觉&#xff0c;而左边…

onvif发送订阅规则

发送消息的主要内容&#xff1a; 1、初始化请求 2、填充要发送的数据 3、发送并接受返回的数据 4、解析数据 5、清理缓存 正文 1、初始化onvif请求 定义一个onvif请求req 定义一个onvif标签tag 临时资源*tmpValue 临时结果tmpresult 主机ip acHostIp[16] ip地址 acLocalAddr…