C语言基础知识点(六)二维数组指针和地址
#include <stdio.h>int main()
{int a[2][3] = {2, 4, 6,8, 10, 12};printf("a:%p, a+1:%p\n", a, a + 1); // 相差3*sizeof(int)=12,二维数组名是一个指向每一行的指针,a:0061FF08, a+1:0061FF14printf("&a:%p, &a+1:%p\n", &a, &a + 1); // 相差6*sizeof(int)=1224,&a:0061FF08, &a+1:0061FF20printf("a[0]:%p, a[0]+1:%p\n", a[0], a[0] + 1); // 相差一个sizeof(int)也就是一个数更多v组元素,a[0]:0061FF08, a[0]+1:0061FF0Cprintf("&a[0]:%p, &a:%p\n", &a[0], &a); // 结果一样,&a[0]:0061FF08, &a:0061FF08printf("&a[0]+1:%p, &a+1:%p\n", &a[0] + 1, &a + 1); //&a[0]跳了12个字节(跳过了一行),而&a跳了24个字节(跳过了整个二维数组)printf("*a:%p, *a+1:%p,*(a+1):%p\n", *a, *a + 1, *(a + 1)); /* a:0061FF08, *a+1:0061FF0C,*(a+1):0061FF14*a+1偏移了一个sizeof(int).*(a+1)偏移了一行 */printf("**a:%p, **a+1:%p,**(a+1):%p\n", **a, **a + 1, **(a + 1));printf("*a[0]:%p, *a[0]+1:%p,*(a[0]+1):%p\n", *a[0], *a[0] + 1, *(a[0] + 1));printf("*a[1]:%p, *a[1]+1:%p,*(a[1]+1):%p\n", *a[1], *a[1] + 1, *(a[1] + 1));
}
-
printf("a:%p, a+1:%p\n", a, a + 1);输出结果:
a:0061FF08, a+1:0061FF14解释:a是指向二维数组第一行的指针,a+1是指向二维数组第二行的指针。每行有3个int元素,所以相差3个sizeof(int)字节,即12个字节。 -
printf("&a:%p, &a+1:%p\n", &a, &a+1);输出结果:
&a:0061FF08, &a+1:0061FF20解释:&a是整个二维数组的地址,&a+1是整个二维数组后面的地址。整个二维数组占用了2行3列,总共有6个int元素,所以相差6个sizeof(int)字节,即24个字节。 -
printf("a[0]:%p, a[0]+1:%p\n", a[0], a[0]+1);输出结果:
a[0]:0061FF08, a[0]+1:0061FF0C解释:a[0]是二维数组的第一行,是指向第一个元素的指针。每个元素占用一个sizeof(int)字节,所以相差一个sizeof(int)字节。 -
printf("&a[0]:%p, &a:%p\n",&a[0], &a);输出结果:
&a[0]:0061FF08, &a:0061FF08解释:&a[0]是二维数组的第一行的地址,与&a相同,都是指向二维数组第一行的指针。 -
printf("&a[0]+1:%p, &a+1:%p\n",&a[0]+1, &a+1);输出结果:
&a[0]+1:0061FF14, &a+1:0061FF20解释:&a[0]+1跳过了一行,相当于指向了第二行的地址;&a+1跳过了整个二维数组,指向了整个二维数组后面的地址。 -
printf("*a:%p, *a+1:%p,*(a+1):%p\n",*a, *a+1,*(a+1));输出结果:
*a:0061FF08, *a+1:0061FF0C,*(a+1):0061FF14解释:*a是指向第一行的指针,解引用后得到第一行的第一个元素;*a+1偏移了一个sizeof(int)字节,即指向第一行的第二个元素;*(a+1)是指向第二行的指针,解引用后得到第二行的第一个元素。 -
printf("**a:%p, **a+1:%p,**(a+1):%p\n",**a, **a+1,**(a+1));输出结果:
**a:00000002, **a+1:00000003,**(a+1):00000008解释:**a是指向第一行的指针,解引用两次后得到第一行的第一个元素;**a+1对第一行的第一个元素加1;**(a+1)是指向第二行的指针,解引用两次后得到第二行的第一个元素。 -
printf("*a[0]:%p, *a[0]+1:%p,*(a[0]+1):%p\n",*a[0], *a[0]+1,*(a[0]+1));输出结果:
*a[0]:00000002, *a[0]+1:00000003,*(a[0]+1):00000004解释:*a[0]是第一行的第一个元素,解引用后得到该元素的值;*a[0]+1加上1;*(a[0]+1)是第一行的第二个元素,解引用后得到该元素的值。 -
printf("*a[1]:%p, *a[1]+1:%p,*(a[1]+1):%p\n",*a[1], *a[1]+1,*(a[1]+1));输出结果:
*a[1]:00000008, *a[1]+1:00000009,*(a[1]+1):0000000A解释:*a[1]是第二行的第一个元素,解引用后得到该元素的值;*a[1]+1加上1;*(a[1]+1)是第二行的第二个元素,解引用后得到该元素的值。

涉及到了指针和数组的相关知识点,以下是一些总结:
-
指针与地址:指针是存储内存地址的变量,可以通过加/减整数来进行地址运算。
&运算符用于获取一个变量的地址。 -
数组与指针:数组名可以看作是指向数组第一个元素的指针。对于二维数组,每一行都可以看作是指向该行第一个元素的指针。使用
a[i]或*(a+i)来访问数组元素。 -
指针运算:指针运算的结果取决于指针类型和操作数的类型。对指针进行加/减操作时,会根据指针所指向类型的大小进行相应的偏移。
-
解引用操作符:使用
*运算符可以解引用指针,获取指针所指向的值。 -
printf格式化输出:
%p用于打印指针地址的值。
二维数组名是指向行的,“&二维数组名”就指向了整个二维数组,"二维数组名[i]" 是指向i行的首元素的地址·。“&二维数组名[i]”就指向了一行。
在C语言中,数组名是一个指向数组第一个元素的指针,即其本身代表了该数组第一个元素的地址。因此,在使用数组名时,可以将其视为指向数组第一个元素的指针,例如a[i]就是指向二维数组第i行第一个元素的指针。
对于二维数组而言,&a[i]表示的是二维数组的第i行的地址,但由于数组名已经代表了该数组第一个元素的地址,所以a[i]和&a[i]其实是等价的,它们所代表的值也相同。

*二维数组名[i]就是取出第i行首元素的值,
*二维数组名[i]+1就是对取出第i行首元素的值进行+1,
*(二维数组名[i]+1)就是对取出第i+1行首元素的值进行+1
相关文章:
C语言基础知识点(六)二维数组指针和地址
#include <stdio.h>int main() {int a[2][3] {2, 4, 6,8, 10, 12};printf("a:%p, a1:%p\n", a, a 1); // 相差3*sizeof(int)12,二维数组名是一个指向每一行的指针,a:0061FF08, a1:0061FF14prin…...
nodejs格式化输入
需求 比如我现在要格式为Axxx-xxx(xxx是数字)的格式,但是输入有可能为A1-2这种情况,就需要补零,变成A001-002 代码实现 const regex /^A(\d)\-(\d)$/; // 正则匹配桩号合法格式const match input.match(regex);if…...
国家网络安全周 | 金融日,一起 get金融行业数据安全
2023国家网络安全宣传周 热度一直在持续! 9月15日是国家网络安全宣传金融日。 目前随着国际形势愈发严峻,金融机构基础设施的全面数字化升级,带来了全新的安全问题。数据安全不单是技术问题,更是已经成为一个关系社会稳定发展的…...
分布式事务解决方案之TCC
分布式事务解决方案之TCC 什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认 Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个…...
Git 的基础命令 码云 gitee
就比如,我们的开发吧,我自己本地分支是dqh,远程分支也是new //我开始提交代码 //1,git add . //2,git commit -mXXX功能 //3,git pull origin new(你们现在这个版本的开发分支) //这里…...
探索工业4.0:数字孪生如何重塑工业生产流程?
在过去的几十年里,工业生产经历了从机械化、自动化到数字化的巨大转变。随着工业4.0的到来,我们正处于第四次工业革命的边缘,这次革命将由数字孪生技术引领。本文将深入探讨数字孪生在工业生产中的应用和潜力。 数字孪生(Digital …...
window server事件ID说明
重启:1074 6013:系统运行时间 6008:非正常关机或者意外关机 WindowsServer2012R2事件id6008什么意思? 在Windows Server 2012 R2中,事件ID 6008是一个系统事件,它通常表示系统的非正常关机或意外关机。当系…...
router-link 和 router-view的区别
router-link 实现路由之间的跳转 router-view(路由出口组件 -> 渲染路径匹配到的视图组件) 当你访问的地址与路由path相符时,会将指定的组件替换该router-view router-link router-link 点击实现路由跳转,to属性指向目标地址&…...
【Leetcode】139.单词拆分
一、题目 1、题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例1: 输入: s = “leetcode”, wordDict = [“leet”, “cod…...
PMP考试一定要报培训班吗?
随着近年来PMP证书在国内日渐吃香,越来越多人开始报考PMP考试,甚至不少企业还会通过各项奖励政策来鼓励内部项目骨干去考取PMP证书。 免费送备考资料。 很多初次参加PMP考试的人会有这种疑惑,那就是考PMP证书必须要参加培训班吗? 在我看来&…...
dart 学习 之 Getters and setters
前言 任何需要对属性进行更多控制而不是允许简单字段访问的时候,你都可以自定义 getter 和 setter。 正文 讲解 Getter(获取器)和Setter(设置器)是面向对象编程中用于控制对类属性访问的特殊方法。Getter用于获取属…...
使用融云 CallPlus SDK,一小时实现一款 1V1 视频应用
9 月 21 日,融云直播课 社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频应用? 欢迎点击小程序报名~ 1V1 音视频、远程服务类应用的实现利器——融云 CallPlus SDK 上线! 关注【融云全球互联网通信云】了解更多 作为新一代音视频通话场…...
Redis Part1
单体架构:一台Web服务器、一台数据库服务器。 1.了解NoSql 什么是Nosql? NoSQL,即Not-Only-SQL,意思就是我们干事情不能只用SQL,泛指非关系型的数据库!NoSQL定位:作为关系型数据库的补充&am…...
代理HTTP使用不当会出现哪些问题?如何正确使用代理服务?
代理HTTP是一种常见的网络代理方式,它为客户端和服务器之间提供中间层,转发上下游的请求和响应。正确使用代理HTTP可以提高采集效率、增加网络安全性、加速网络速度、保护用户隐私。但是,使用不当就难以达到预期的效果,在使用代理…...
利用芯片74hc165为单片机增加输入扩展端口proteus仿真arduino
我们前面的博文《输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用》介绍了148,148输入后可以立即输出到数码管,可以说它是自带编BCD编码器的。而今天这里我们主要介绍的74hc165是没有编码器,这里我们以proteus为仿真环境…...
docker真实IP解决
背景 在微服务的环境中使用docker部署各个应用,部分应用使用容器内的真实ip暴露出服务。会导致微服务之间调用出现网络超时,要解决这个问题需要让微服务暴露为宿主机的ip 解决 方式一 使用docker-compose的配置 network_mode: "host" emq…...
Linux 内存泄漏检测的基本原理
一、mtrace分析内存泄露 mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。 它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数 void mtrace ()&…...
Ubuntu下Nginx配置ModSecurity详细思路及过程
下面是一个简介: Ubuntu是一个linux操作系统,Nginx是一个web服务器软件,ModSecurity是一款开源的web应用防火墙(江湖人称“WAF”)。 如果上面的概念没有一定的了解,下面的内容其实也能看。就是不好操作。…...
入职美团近三个月,闲聊几句
校招入职美团近3个月,随便聊聊 今天和组内的小伙伴们团建来着,聊了很多,感触颇深,碎碎念一下。 作为组内的唯一的校招生,刚入职时面对复杂的业务,各种不熟悉的工具,真的是一脸懵。至少对我自己…...
setInterval倒计时切换页面后不准
背景 最近在做一个倒计时时,发现当切换浏览器tab后,再切回倒计时页面,倒计时的数据不准,比真正的剩余时间多,短时间还好,时间长了,计时器的误差会很大。 原因 倒计时是用setInterval每1000毫…...
车载测试进阶:高效adb命令实战与典型场景解析
1. 为什么车载测试工程师必须掌握adb命令? 作为一名在车载测试领域摸爬滚打多年的工程师,我深刻体会到adb命令就像测试人员的瑞士军刀。记得刚入行时,面对车机系统频繁崩溃却束手无策,直到前辈教我使用adb logcat抓取实时日志&…...
罗克韦尔 1440-SCDB9FXM2通信电缆
1440-SCDB9FXM2 是罗克韦尔自动化旗下 Allen-Bradley 品牌,专为 1440 XM 系列设备状态监测模块设计的原厂专用串行通信电缆,是 XM 系统组态调试、现场运维的核心配件。一、产品特性专属原生适配:专为 XM 全系列设备状态监测模块(X…...
Java异常与事务回滚:从Throwable顶层继承到rollbackFor陷阱的深度解析
在Java企业级开发中,异常处理与事务管理是保障系统稳定性的两大基石。然而,许多开发者在面对Transactional注解的rollbackFor属性、try-catch块中的异常处理以及Java异常体系的顶层结构时,往往存在认知误区。本文将从异常体系的顶层父类出发&…...
代码随想录算法训练营第五十六天|prim算法、kruskal算法
题目链接:53. 寻宝 解题思路:prim 算法 具体思路: 首先读取节点数 v 和边数 e,构建大小为 (v 1) * (v 1) 的邻接矩阵 graph,初始值设为 10001 表示节点间无直接边,适配权值不超过 10000 的场景&#x…...
移动端性能测试:Android Studio Profiler 深度优化实践
一、性能测试核心维度与Profiler工具链1.1 四大关键性能指标模块监控指标测试场景CPU线程活动/核心利用率列表滑动卡顿、复杂计算延迟内存Java堆占用/对象分配追踪内存泄漏、频繁GC导致的卡顿网络请求频率/数据传输量接口重复调用、无效流量消耗能耗唤醒锁/Wakeup事件后台异常耗…...
紧急预警|2026年智能摄像头漏洞大爆发!
智能摄像头早已渗透生活的每一个角落——家庭客厅、商铺门店、企业车间、城市街头,甚至医院、港口等敏感区域。但很少有人知道,这个“守护眼”,随时可能变成泄露隐私、窃取情报的“透视镜”。 据Check Point 2026年网络安全报告披露ÿ…...
BLE谐波测试
Measure → Harmonic Distortion → 设置 Fundamental Freq f₀ → 设置 Number of Harmonics 2(或更多) → RUN → 自动显示各次谐波的 dBm 和 dBc然后用500通过USB左发射源...
QT(二):Qt相关控件的使用和设置,Qt对话框的使用,画图事件的创建和设置,线程和锁的创建利用,网络编程,TCP和UDP客户端及服务器的创建,SQLITE数据库,QTableWidget控件的使用
一、相关控件及操作配置1、QPushButton & QtoolButton(按钮)setText(QString) ---- 设置按钮上的内容setFixedSize(int w, int h) --- 设置固定大小setFixedHeight(int) --- 设置固定高度setFixedwidth(int) --- 设置固定宽度setMaximumSize(…...
Oga性能优化指南:提升Ruby XML/HTML解析速度的秘诀
Oga性能优化指南:提升Ruby XML/HTML解析速度的秘诀 【免费下载链接】oga Oga is an XML/HTML parser written in Ruby. 项目地址: https://gitcode.com/gh_mirrors/og/oga Oga是一款用Ruby编写的高性能XML/HTML解析器,以其出色的解析能力和优化的…...
基于低频FDTR的热界面材料导热性能与缺陷探测研究
🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...
