C语言——详解二维数组中元素的地址

在C语言中,二维数组元素的地址认知是一个相对复杂但重要的概念。以下是对二维数组中元素地址认知的详细叙述:

一、二维数组的基本构成

二维数组可以被看作是由多个一维数组组成的数组。例如,定义了一个3行4列的二维数组,

int a[3][4] = { {1,3,5,7},
                {9,11,13,15},
                {17,19,21,23}
               }

其中a[0]a[1]a[2] 分别代表这个二维数组中的三个一维数组(即行),同时也是这三个一维数组的首地址,本身代表的是一个地址,而不是二维数组中一个元素的值,并不能代表对应行的首元素值作为输出。即

printf("%d",a[0]);

是错误的,因为它本身是一个地址,不能作为一个值输出。

printf("%d",*a[0]);

是正确的且输出结果为1,即第一行一维数组首元素的值。

二、二维数组名的含义

  • 二维数组名是一个地址常量:二维数组名(如a)是一个指向其首元素的指针,即指向第一个一维数组(或第一行)的指针。在C语言中,数组名代表数组首元素的地址,因此a的值是二维数组首元素(即第一行)的地址。
  • 二维数组名与行指针:二维数组名也可以被理解为行指针,它指向的是一个一维数组(行)的首地址。
  • 二维数组名 = 第一个一维数组(或第一行)的地址 = 存放的是二维数组第一个元素的值

三、二维数组中元素的地址

  1. 首元素的地址:二维数组的首元素地址是&a[0][0],它同时也是二维数组名a的值。
  2. 行地址
    • a+i(其中i是非负整数)表示二维数组中第i行的首地址。例如,a+1是第二行(即a[1])的首地址。
    • a[i](其中i是非负整数且小于行数)也是第i行的首地址,同时它也是一个一维数组名,代表一个一维数组(即一行)。
  3. 列地址
    • 在二维数组中,我们通常不直接谈论“列地址”的概念,因为列是通过行和列索引来定位的。但是,我们可以说a[i]+j(其中i是行索引,j是列索引)表示第i行第j个元素的地址。例如,a[0]+1是第一行第二个元素的地址(即&a[0][1])。
  4. 元素的值与地址
    • 要获取二维数组中某个元素的值,我们可以使用a[i][j]的形式。
    • 要获取该元素的地址,我们可以使用&a[i][j]

四、二维数组地址的等价表示

在C语言中,二维数组的地址可以通过多种方式等价表示:

(1)a[i] 等价于 *(a+i)等价于a+i,都表示第i行的首地址。

为什么 *(a+i) 可以作为地址使用

       当 a 是一个二维数组时,a 本身是数组名代表首元素地址,等价于一个指向其第一行的指针。因此,a+i 计算出的是指向第 i 行的指针(注意这里的“行”本身也是一个数组或一维数组)。在二维数组中,*(a+i) 或等价地 a[i]他们是一个指向一个一维数组的指针,本身的值就是指向的数组的首元素的地址

  *(a+i) 在这个上下文中通常被视为一个数组名(或行指针),而不是一个具体的值。要访问第 i 行第 j 列的元素,我们需要进一步解引用,即 *(*(a+i)+j) 或 a[i][j]

        总结来说,*(a+i) 可以作为地址使用,因为它通过解引用操作获取了指针所指向的值,而这个值实际上是数组元素的地址。

(2)a[i]+j 等价于 *(a+i)+j,都表示第i行第j个元素的地址,但是等价于(a+i)+j

  a[i]+j :a[i] 表示二维数组 a 的第 i 行的首地址。由于数组是连续存储的,a[i] 实际上指向了第 i 行的第一个元素的内存地址。a[i]+j 表示从第 i 行的首地址开始,向后偏移 j 个整数的位置。这正好是第 i 行第 j 列元素的地址。

  *(a+i)+j :首先通过 (a+i) 获取指向第 i 行的一个指针,通过解引用运算符 * 获得这个指针的值即第 i 行首元素的地址,然后 +j 等同于在内存地址上向后偏移 j 个整数的位置,因此也得到了第 i 行第 j 列元素的地址。

  (a+i)+j:a 是指向二维数组首元素的指针。a+i 表示从 a 开始,按照数组的行数来偏移。如果数组的每行有 N 个元素,那么 a+i 实际上偏移了 i*N 个整数的位置,指向第i行的第一个元素。(a+i)+j 这里再次使用 +j,并不是在内存地址上简单偏移两个整数,而是根据数组的行数来偏移。这意味着 (a+i)+j 实际上相当于 (a + i*N) + j*N,即从第二行的首地址开始,再偏移 j*N 个整数的位置。

五、注意事项

  • 在处理二维数组时,要注意不要越界访问数组元素,这可能会导致未定义行为。
  • 数组名是一个常量指针,不能对其进行赋值操作(如a++是非法的),但可以通过指针算术来访问数组的不同部分。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战分享:利用百数实现通讯录与表单无缝对接,提升管理效率

百数的通讯录实时同步到表单功能,实现了员工信息的即时更新与自动整合,不仅极大地提升了信息管理的效率与准确性,还为企业提供了便捷的数据分析基础,助力企业更高效地运营与决策。 设置方式 在企业管理中,开启通讯录…

深度学习入门——神经网络

前言 神经网络可以帮助自动化设定权重 具体地讲,神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数 从感知机到神经网络 神经网络的例子 中间层aka隐藏层 复习感知机 偏置b 并没有被画出来。如果要明确地表示出b,可以像图3-3那样做…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

多模态大模型--音频文本

音频信息 声学 音频编解码技术的目标是&#xff0c;通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下&#xff0c;即使音频被压缩&#xff0c;我们听到的声音与原版也应该没有任何区别。 Opus是一个多才多艺的音频编解码器&#xff0c;它适用于各种应…

Linux系统之快速部署小游戏合集网站(二)

Linux系统之快速部署小游戏合集网站(二) 一、项目介绍1.1 项目简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看apach…

FPGA-Verilog

这里写目录标题 累加累乘器 累加累乘器 timescale 1ns/10psmodule inout_test(); parameter ratio 2; reg [15:0]num ; reg [31:0]save_add_v; reg [31:0]save_multi_v;initialbeginsave_add_v 100;save_multi_v 100;forever beginsave_add_v save_add_v ratio;save_mul…

基于视觉工具箱和背景差法的行人检测,行走轨迹跟踪,人员行走习惯统计matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 在三维图中&#xff0c;幅度越大&#xff0c;则表示人员更习惯的行走路线。 2.算法运行软件版本 matlab2022a 3.部分核…

[笔记]Fluke3563 振动分析仪

参考文档&#xff1a;Fluke 3563 Analysis Vibration Sensor system | Fluke 1.四大机械故障损伤原因 2.振动特征 福禄克做的示意图很棒&#xff1a; 不平衡对应转动轴的一倍频&#xff0c;不对中是2倍频&#xff0c;然后3~6倍频会有未紧固故障&#xff0c;更高频的位置是齿轮…

新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…

解决 Vscode不支持c++11的语法

问题&#xff1a; 解决方案&#xff1a; 1、按 CtrlShiftP 调出命令面板&#xff0c;输入 C/C: Edit Configurations (UI) 并选择它。这将打开 C/C 配置界面 2、打开 c_cpp_properties.json 文件 3、编辑 c_cpp_properties.json 4、保存 c_cpp_properties.json 文件。 关闭并…

ollama + fastgpt 搭建免费本地知识库

目录 1、ollama ollama的一些操作命令: 使用的方式: 2、fastgpt 快速部署: 修改配置: config.json: docker-compose.yml: 运行fastgpt: 访问OneApi: 添加令牌和渠道: 登陆fastgpt,创建知识库和应用 3、总结: 附录: 1. 11434是ollama的端口: 2. m3e 测…

设计模式-概述*

1.代码的质量的评判 可维护性&#xff1a;不破坏原有代码设计以及不引入新的bug的前提下&#xff0c;能够快速修改或新增代码&#xff1b;可读性&#xff1a;人类能理解的代码&#xff08;编程规范-命名、函数是否冗长、类是否过大等&#xff09;&#xff1b;可扩展性&#xff…

【Java】:浅克隆和深克隆

克隆 克隆和赋值 克隆的结果是有多个相同的实体&#xff0c;各个对象指向不同的实体而多个不同对象指向一个相同的实体不是克隆&#xff0c;而是赋值 克隆的过程 首先实例化一个 student1 对象 在堆里开辟了一块内存用来存储 age 10 这个数据 调用 clone 方法 在堆中又开辟了一…

数字化转型“破局”:低代码开发平台如何缩短开发交付周期,提升效率

日新月异的数字时代&#xff0c;各行业正经历着前所未有的变革与转型。随着大数据、云计算、人工智能等技术的不断成熟与融合&#xff0c;数字化转型的步伐愈发坚定而迅速&#xff0c;成为企业转型升级、实现可持续发展的必由之路。然而&#xff0c;传统的软件开发模式受限于高…

Hadoop3:HDFS-存储优化之纠删码

一、集群环境 集群一共5个节点&#xff0c;102/103/104/105/106 二、纠删码原理 1、简介 HDFS默认情况下&#xff0c;一个文件有3个副本&#xff0c;这样提高了数据的可靠性&#xff0c;但也带来了2倍的冗余开销。Hadoop3.x引入了纠删码&#xff0c;采用计算的方式&#x…

【学习】美国虚拟信用卡申请流程

WildCard 官方网址&#xff1a;https://bewildcard.com/i/PEACEFUL &#xff08;使用邀请码“PEACEFUL”可以享受开卡88 折优惠&#xff0c;注册时提示填写邀请码就可以填写&#xff09;

Window中 Redis下载安装

Redis7.2.3连接&#xff1a; 我用夸克网盘分享了「redis-windows-7.2.3.zip」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/4dfb0497707a 在安…

驱动框架——CMSIS第一部分 RTE驱动框架介绍

一、介绍CMISIS 什么是CMSIS&#xff08;cortex microcontrol software interface standard一种软件标准接口&#xff09;&#xff0c;官网地址&#xff1a;https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…

蓝桥 双周赛算法赛【小白场】

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 蓝桥第14场小白入门赛T1/T2/T3 题目&#xff1a; T1照常还是送分题无需多…

cesium 实现地图环境功能 - 雨,雪,雾特效

需求背景解决效果Codeindex.vuefogEffect.tsrain.glslsnow.glslfog.glsl 需求背景 需要实现天气模拟&#xff0c;日照模拟功能&#xff0c;提高三维实景效果 解决效果 Code 注意&#xff1a;我以下glsl文件时基于 webgl1.0&#xff0c;即cesium&#xff0c;创建球的时候&…