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毫…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
