第二章 再一次吃惊----数组的数组与多维数组的区别

再再论指针----篇首语         指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的现象,这种不足必然导致程序员在指针 阅读详情

 原文:http://blog.youkuaiyun.com/megaboy/article/details/482781

看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:

1。内存映象一样。

2。数组引用方式一样,都是“数组名[下标][下标]........”。

3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。


        由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组跟多维数组似乎是一样的,这造成了C程序员对两者的区别长期以来模糊不清。但实际上,c语言限于本身的语言特性,实现的并非真正的多维数组,而是数组的数组。

        数组的数组与多维数组的主要区别,就在于数组的数组各维之间的内在关系是一种鲜明的层级关系。上一维把下一维看作下一级数组,也就是数组嵌套。数组引用时需要层层解析,直到最后一维。举个例,对于数组:
int a[7][8][9];
如果要访问元素a[4][5][6],首先就要计算第一维元素4的地址,也就是a+4,由于是数组的数组,元素4的值代表了一个数组,因此元素4的值就是它所代表的那个数组的首地址,我们用一个符号address1代表它,也就是address1=*(a+4),接着计算第二维,显然元素5的地址是address1+5,其值也是一个数组的首地址,用address2表示它,就是address2=*(address1+5),最后一维,由于已经到达了具体的元素,因此这个元素的地址是address2+6,其值*(address2+6)是一个整数,把address1和address2分别代入相应表达式,就成了:
*(*(*(a+4)+5)+6);
这就是我们熟知的[]运算符的等价表达式。

        而真正的多维数组并没有这么多“束缚”,相比之下简单得多,由于各维之间不是这种复杂的层级关系,元素a[4][5][6]的偏移量可以这样直接获得:(4x8x9+5x9+6)xsizeof(int),再加上数组的首地址a就是元素a[4][5][6]的地址了。但是,c语言的数组能够这样用首地址加上(4x8x9+5x9+6)xsizeof(int)的形式来访问元素吗?显然是不行的。归根到底就在于C语言的地址数据类型不但有类型,还具有级别。就是这种层级关系造成了C语言只能用数组的数组当作多维数组。如果C语言非得要实现真正的多维数组,那么地址与指针的概念就得重新改写了。


当Kmer遇到多倍体:复杂基因组Survey分析中的避坑指南 本文针对小麦、棉花等多倍体及高杂合复杂基因组的Survey分析,深入解析了Kmer分布图解读中的常见陷阱。文章重点探讨了如何超越理想二倍体模型,利用Smudgeplot等工具准确判断基因组倍性,并提供了从参数优化、污染判断到结果验证的全流程实战指南,帮助研究者规避错误,获得更准确的基因组大小、杂合度等关键信息。 阅读详情

相关推荐

DVWA靶场实战:从搭建到渗透测试的完整指南

本文详细介绍了DVWA靶场的搭建与渗透测试全流程,涵盖LAMP环境搭建、Docker部署及集成环境安装三种方式。通过SQL注入、文件上传漏洞等实战案例,帮助读者掌握Web安全测试技巧,并提供防御方案与进阶调优建议,是网络安全学习的实用指南。

weixin_28312391的博客 488

Crack C语言之-指针之六

再一次吃惊--数组的数组与多维数组的区别看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:1。内存映象一样。2。数组引用方式一样,都是“数组名[下标][下标]........”。3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组跟多维数组似乎是一样的,这造成了C程序员对两者的区别长期以来模糊不清。但实际上,c语言限于本身的语言特性

GhostTigerMan 480

Allegro Design Entry CIS 与 OrCAD Capture CIS:PCB设计工具链中的双雄对决

本文深入对比了Cadence旗下两大原理图设计工具Allegro Design Entry CIS与OrCAD Capture CIS。Allegro Design Entry CIS源自Concept HDL,定位高端,强调自顶向下的层次化设计和与Allegro PCB Editor的无缝约束管理,适合大型复杂系统及团队协作。OrCAD Capture CIS则以其出色的易用性、广泛的兼容性和强大的CIS数据库功能著称,是中小型项目及跨工具链协作的通用选择。文章从历史渊源、核心功能、适用场景等多维度剖析,

bush的博客 486

数组、二维数组、多维数组

数组 数组的概述: 数组就是内存中连续存储多个数据的空间 创建方法 function fun(){ //第一种:var arr = [1,2,3,4,5]; //第二种:var arr1 = new Array[1,2,3,4,5]; } 二维数组 二位数组就是数组中存储数组 创建方法 function fun(){ var arr = []; for(var i =0;i <...

HelloGad的博客 509

Habitat安装全网最详细教程,手把手带你跑通example.py(全网唯一)

全网最详细具身智能仿真平台habitat的安装教程

shannanshouyin的博客 2756

PostgreSQL隐式类型转换全解析:告别operator does not exist

强类型数据库是现代数据系统的基石,它在带来严谨性的同时,也常常让开发者在类型不匹配报错前束手无策。当一条SQL因bigint与text比较而抛出operator does not exist时,根源往往在于对数据库隐式转换规则的误解。PostgreSQL通过pg_cast系统表将转换划分为隐式、赋值与显式三个级别,并依据操作符解析逻辑决定是否自动提升类型。理解这些机制,不仅能快速定位JOIN、UNION、函数调用等场景下的类型错误,还能帮助开发者合理使用EXPLAIN VERBOSE、pg_typeof等工

weixin_29587015的博客 304

数组与多维数组

数组与多维数组 数组的使用 普通的For循环 例题:打印全部的数组元素;计算所有元素之和; 查找最大元素 package com.deng.array; ​ public class arrayDemo03 { public static void main(String[] args) { int[] arrays ={1,2,3,4,5}; ​ //打印全部的数组元素 for (int i = 0; i < arrays.length; i...

D19992730096的博客 203

拯救者R7000P(2021)装双系统Ubuntu20.04 解决联发科MT7921无线网卡在Ubuntu中不能联网

拯救者R7000P(2021)装双系统Ubuntu20.04/Ubuntu18.04 电脑配置:联想拯救者R7000P CPU:AMD R7-5800H GPU:RTX3060-6G 内存:16GB 固态:500G(原装)+500(加装) 1.做系统盘(本文以Ubuntu20.04为例) 1.下载Ubuntu20.04镜像 直接去Ubuntu官网或者一些国内的镜像去下载都可以,这里给出一个网址https://ubuntu.com/download/desktop,根据需要下载自己学要的Ubuntu版本,后缀

qq_41108639的博客 1万+

第二章 再一次吃惊----数组的数组与多维数组的区别

        看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:1。内存映象一样。2。数组引用方式一样,都是“数组名[下标][下标]........”。3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。        由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组

7663

AMBA-CHI协议详解(三)

Write Transactions、Atomic transactions、 Stash transactions、 Dataless transactions的等各个事务的事务流。

Crazzy_M的博客 3180

【unity实战】Unity手搓脚本工具实现合并网格功能

本文介绍了在Unity中优化网格性能的方法,通过合并重复网格减少绘制调用。主要使用Mesh.CombineMeshes方法实现网格合并,支持统一材质和多材质处理。核心内容包括:1)基础合并脚本实现,将子网格合并到父对象并禁用原网格;2)统一材质设置,支持自定义或默认材质;3)多材质合并方案,通过设置mergeSubMeshes=false保留子网格材质索引。文章还提供了完整代码示例和操作演示,适用于实际项目中的网格优化需求。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 558

java学习笔记(九)一维数组与内存关系

目录 1.一维数组含义: 2.数组作用: 3.数组的声明: 4.数组的初始化 1.静态初始化: 2.动态初始化: 内存: 步骤: 静态初始化内存: 我们来看看动态初始化 5.数组的使用: 1.通过下标获取元素 2.获取数组中元素个数 3.遍历数组 4.增强for循环遍历数组 注意: 6.数组的复制 数组复制内存图​ 我们来看看复制时候的内存图 7.数组的扩容 8.数组的删除 今天来学习一维数组,并深入底层理解一维数组。 1.一维数组含义: 一组数组...

yang_yi_yun的博客 1403

【CASS精品教程】032:CASS11台阶画法案例大全

一、普通无边台阶 二、普通有边台阶 三、普通圆弧无边台阶 四、U型台阶 五、曲线U型台阶 六、L型台阶

智慧空间实验室 7463

第二章 再一次吃惊!----数组的数组与多维数组的区别

看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点: 1。内存映象一样。 2。数组引用方式一样,都是“数组名[下标][下标]........”。 3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。 由于两者的共同点主要反映在外部表现形式上,因此,从外部看...

weixin_30575309的博客 69

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入理解C与指针

再再论指针----篇首语 【说明:】本系列所有博文均转自----- http://blog.youkuaiyun.com/supermega 好 东西当然要大家一起分享。。。。。。。         指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语

liulianglin的专栏 727

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

二维数组与二级指针

室友编写了关于一个二级指针与二维字符串数组的程序,但是老是报段错误,不明就里,让我帮忙调试。我根据他的程序出理的问题,写了另外一个简单一点的程序,来了解问题所在,程序如下: 运行gcc  -W  b.c -o  b,会产生警告信息: 运行: ./b,果断报段错误了。 之所以会报警告错误,原因在于c语言的多维数组实际上是数组的数组,a与b的类型并不匹配,a是一个具有

wssg3620625的专栏 1261

C 专家编程笔记(三) 数组和指针

http://blog.adintr.com/43  数组的下标应该从 0 还是从 1 开始?我提议的妥协方案是 0.5,可惜他们未予认真考虑便一口回绝。                                  ----StanKellBo     在 x = y 中,x 代表一个地址,被称为左值。Y 代表的是地址中的内容,被称为右值。左值在编译时可知,右值在运行时

几罗星人的专栏 1079

再论指针_绝好东东

摘自: 优快云文库 整理: 王向阳   指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的现

dcw0402的专栏 653

再再论指针

 再再论指针----篇首语        指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的

云,风扬起的地方 1897

php 去掉数组中的空值_PHP删除数组中空值的方法介绍

这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下:...

weixin_40007189的博客 370
上一篇: 第一章 什么是数组名?----一个让你吃惊的事实!
下一篇: 第三章 数组的解剖学
小文兄弟
博客等级 码龄17年 28粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值