当前位置: 首页 > article >正文

C语言指针概念详解:数组指针与二级指针的本质区别

前言最近考研复试在复习C语言突然看到以前初学时没有深究的一个知识点数组指针与指针数组int (*p)[5] vs int *p[5]之前一直以为这它们虽然一个本质是指针一个本质是数组但是二者同为二级指针可以相互转换。今天查阅资料并与AI深度交流才终于弄懂二者的区别。先说结论数组指针本质是仍然是一级指针虽然数组指针指向数组数组名在某些场景如函数可以退化为指针但是数组虽然会退化但本身不是指针变量。而指针数组它本质是一个数组每个数组元素存储一个变量地址且指针数组在函数参数其实就等价为二级指针。更多补充指针数组vs数组指针即各自函数传参因此探讨的核心即为数组指针与二级指针的本质区别核心问题为什么char (*p)[5]不是二级指针你的困惑很有代表性关键在于理解数组名的双重身份和指针指向的目标类型。让我们一步步拆解1. 数组名的双重身份数组名在C语言中有两个不同的身份身份1数组整体的标识符char arr[5] hello; printf(arr %p\n, arr); // 数组整体的地址类型char (*)[5]arr是整个数组的地址类型是char (*)[5]指向长度为5的char数组的指针这是一个具体的内存位置可以被存储在数组指针中身份2数组首元素的地址数组名退化char arr[5] hello; printf(arr %p\n, arr); // 首元素地址类型char* printf(arr[0] %p\n, arr[0]); // 和上面完全相同当数组名单独使用时如作为函数参数会自动退化为指向首元素的指针此时arr等价于arr[0]类型是char*2. 关键数组指针指向的是什么char arr[3][5] {abc, def, ghi}; char (*p)[5] arr; // arr退化后是 char (*)[5] 类型分析p的指向p存储的是arr[0]第一行数组的地址arr[0]是一个长度为5的char数组不是指针变量因此p是一个指向数组的指针不是指向指针的指针内存布局对比情况1二维数组char arr[3][5]内存中是连续的字符序列地址 | 0x100 | 0x101 | 0x102 | 0x103 | 0x104 | 0x105 | 0x106 | ... 内容 | a | b | c | \0 | ? | d | e | ... |---- arr[0] ----| |---- arr[1] ----|arr[0]是数组不是指针变量p指向arr[0]的起始地址情况2指针数组char *arr[3]内存中是指针变量的数组地址 | 0x100 | 0x101 | 0x102 | 0x103 | 0x104 | 0x105 | 0x106 | ... 内容 | 0x200 | 0x210 | 0x220 | ? | ? | ? | ? | ... |---- arr[0] ----| |---- arr[1] ----|arr[0]是指针变量存储字符串的地址如0x200char **p arr中p指向arr[0]指针变量3. 为什么char (*p)[5]不是二级指针二级指针的定义是指向指针变量的指针反证法如果char (*p)[5]是二级指针那么*p应该是一个指针变量**p应该能访问到最终数据但实际情况char arr[3][5] {abc, def, ghi}; char (*p)[5] arr; printf(*p %p\n, *p); // *p 是 arr[0]第一行数组的地址 printf(**p %c\n, **p); // **p 等价于 *(*p 0) *arr[0] arr[0][0] a*p不是指针变量而是arr[0]数组的地址**p访问的是arr[0][0]第一个字符不是通过两次解引用指针变量4. 总结本质区别| 指针类型 | 存储的地址 | 指向的目标类型 | 是否是二级指针 | |---------|------------|---------------|---------------| |char **p| 指针变量的地址 |char*指针 | ✅ 是 | |char (*p)[5]| 数组的地址 |char[5]数组 | ❌ 不是 |核心结论二级指针的关键是「指向指针变量」数组指针指向的是「数组」数组虽然会退化但本身不是指针变量判断是否为二级指针要看指向的目标类型而不是语法结构或数组名的退化特性记住数组名的退化是C语言的语法规则但这并不改变数组本身的类型。数组指针指向的始终是数组而不是指针变量。

相关文章:

C语言指针概念详解:数组指针与二级指针的本质区别

前言 最近考研复试在复习C语言,突然看到以前初学时没有深究的一个知识点:数组指针与指针数组(int (*p)[5] vs int *p[5]) 之前一直以为这它们虽然一个本质是指针,一个本质是数组,但是二者同为二级指针&am…...

利用qwen 3.5-9b模型识别几何图像并转换成latex tikz代码

一开始用的是0.8b,没有识别成功,重复输出\\draw [blue] (1,-1) -- (0,0);\n\\draw [blue] (0,0) -- (1,0);, 被我终止了。 再用大一点的9b试一下,以前编写python程序就遇到0.8b错误,而9b正确的情况。 先下载9b的mmproj文件&…...

“十五五”规划:新建若干所新型研究型大学

以下内容转载自微信公众号“青塔”,仅作分享 原文链接:https://mp.weixin.qq.com/s/fy9WLPuZ3T_u_D1ywoK7rQ 近日,新华社受权全文播发《中华人民共和国国民经济和社会发展第十五个五年规划纲要》与李强总理代表国务院在十四届全国人大四次会…...

AIA | 西工大马启悦,高传强等:物理指导的激波抖振抑制翼型优化设计研究

物理指导的激波抖振抑制翼型优化设计研究 Physics-guided airfoil optimization design for shock buffet suppression 马启悦,高传强*,邬晓敬,张伟伟 引用格式: Ma Q, Gao C, Wu X, et al. Physics-guided airfoil optimizatio…...

【杂谈】-人工智能蓬勃演进背后的隐性支撑体系

人工智能蓬勃演进背后的隐性支撑体系 文章目录人工智能蓬勃演进背后的隐性支撑体系1、人工智能扩张正改写资源需求格局2、降低对社区的影响,已成为企业发展的紧迫使命3、从公开承诺迈向基础设施层面的实质性变革4、立足资源约束,开展基础设施创新设计人工…...

【MicroPython编程-ESP32篇:设备驱动】-8x8LED点阵驱动(基于Max7219+SPI)

8x8LED点阵驱动(基于Max7219+SPI) 文章目录 8x8LED点阵驱动(基于Max7219+SPI) 1、Max7219 LED驱动器介绍 2、软件准备 3、硬件准备 4、代码实现 4.1 MAX7219传感器驱动 4.2 主程序 1、Max7219 LED驱动器介绍 MAX7219/MAX7221是一款紧凑型串行输入/输出共阴极显示驱动器,可将微…...

实战演练:从零构建基于线性表的图书管理系统

1. 为什么选择线性表实现图书管理系统 刚接触数据结构时,很多人会疑惑:为什么图书管理系统要用线性表实现?这个问题我也思考了很久。直到去年帮学校图书馆升级系统时,我才真正理解线性表的优势。想象一下图书馆的书架,…...

Kali 离线环境部署 ipmitool 实战指南

1. 为什么要在Kali离线环境折腾ipmitool? 如果你和我一样,经常需要带着Kali Linux笔记本钻进机房、数据中心,或者在一些网络隔离的敏感环境里做安全评估或运维工作,那你肯定对“离线”这两个字又爱又恨。爱的是,离线环…...

ECharts高级技巧:动态控制饼图hover效果,让隐藏数据真正‘消失‘

ECharts高级技巧:动态控制饼图hover效果,让隐藏数据真正"消失" 在数据可视化领域,ECharts作为一款强大的JavaScript图表库,其灵活性和定制化能力一直备受开发者青睐。特别是在处理复杂交互场景时,ECharts提供…...

【STM32CubeMX】基于ADC反馈与DAC输出的PID闭环电压调节实战

1. 从零开始:为什么我们需要一个“聪明”的电压调节系统? 大家好,我是老张,一个在嵌入式领域摸爬滚打了十多年的工程师。今天我想和大家聊聊一个非常经典且实用的实战项目:用STM32做一个能自己“思考”和“调整”的电压…...

解决gcc编译错误:sys/cdefs.h缺失问题的全面指南

1. 问题现象与背景分析 当你尝试在64位Linux系统上编译32位程序时,突然遇到这样的报错信息: /usr/include/features.h:367:25: fatal error: sys/cdefs.h: No such file or directory这个错误看起来让人一头雾水——明明系统运行得好好的,为什…...

Matlab新手必看:DPABI脑影像分析工具从下载到运行的完整指南(附SPM配置)

Matlab脑影像分析实战:DPABI与SPM环境配置全解析 在神经科学研究领域,脑影像数据分析一直是推动认知科学、临床医学和心理学发展的重要工具。对于刚接触这一领域的科研人员来说,如何快速搭建一个稳定可靠的分析环境往往是第一个需要跨越的门槛…...

Meta联合国际警方使用AI技术打击全球诈骗网络

并非所有诈骗都始于恶意软件或账户被盗。有时,一个好友请求或聊天中分享的链接就足以实施诈骗。Meta为保护用户免受诈骗分子侵害,周三宣布在WhatsApp、Facebook和Messenger中新增反诈骗工具,包括WhatsApp的设备关联警告和Facebook的可疑好友请…...

从TI杯D题手势识别装置出发:OpenMV与Arduino的嵌入式视觉开发指南

从手势识别到嵌入式视觉:OpenMV与Arduino实战开发全解析 在智能硬件开发领域,手势识别技术正逐渐从实验室走向实际应用。不同于传统的传感器方案,基于计算机视觉的手势识别系统无需接触设备,通过摄像头捕捉手势动作即可实现人机交…...

FastReport 6.9.15在Delphi 11上的完整配置流程(含TeeChart集成)

FastReport 6.9.15在Delphi 11上的完整配置与TeeChart集成实战指南 对于Delphi开发者而言,FastReport作为一款功能强大的报表工具,能够显著提升数据可视化与报表生成效率。本文将详细介绍在Delphi 11环境中配置FastReport 6.9.15的全过程,并重…...

GNS3 3.0.5实战:5分钟搞定Cloud设备与VMware网卡桥接(附排错技巧)

GNS3 3.0.5云设备与VMware网卡桥接实战指南 1. 环境准备与基础配置 在开始GNS3与VMware的桥接实验前,需要确保基础环境配置正确。GNS3 3.0.5版本采用了全新的架构设计,将核心服务全部迁移到了GNS3虚拟机中运行,这带来了更高的稳定性和兼容性&…...

USB(三)——状态转换与枚举优化

1. USB设备状态转换机制详解 USB设备从插入到正常工作需要经历一系列状态变化,这个过程就像新生婴儿从出生到逐渐适应环境。我调试过上百个USB设备,发现90%的稳定性问题都出现在状态转换阶段。让我们用最接地气的方式拆解这个流程。 1.1 从物理连接到逻辑…...

知识图谱实战:从零构建企业级知识库的完整技术路线

1. 知识图谱的工业级应用场景 第一次接触知识图谱是在2016年,当时参与一个金融风控项目,需要从海量非结构化数据中挖掘企业关联关系。传统的关系型数据库在处理多层股权穿透查询时,性能急剧下降,而改用图数据库后,查询…...

LIN诊断---传输层协议数据单元(PDU)详解与应用

1. LIN诊断传输层PDU基础解析 第一次接触LIN诊断时,我也被各种缩写搞得晕头转向。后来在实际项目中调试车窗控制器才发现,理解PDU(Protocol Data Unit)就像拆解快递包裹——外包装标注了收件人、包裹类型和内容物信息。LIN总线上的…...

深入解析3-8译码器:从原理到实践应用

1. 3-8译码器基础原理 第一次接触3-8译码器时,我完全被那一堆输入输出线搞晕了。后来才发现,它的核心逻辑其实特别简单——就像小区里的快递柜,输入三位取件码(比如101),对应的5号柜门就会自动打开&#xf…...

Docker命令实战指南:从入门到精通的必备操作手册

1. Docker基础命令:从零开始上手 第一次接触Docker时,我完全被各种命令搞晕了。后来发现只要掌握几个核心命令,就能完成80%的日常操作。先来看看最基础的几个命令: docker version这个命令会显示你安装的Docker客户端和服务端版本…...

金融学考研笔记三

第三讲 国际收支与国际资本流动第一节 国际收支一、国际收支国际收支是在一定时期内一个国家或地区与其他国家或地区之间进行的全部经济交易的系统记录。国际收支记录的是对外的交往,即一国居民与非居民之间的交往。居民是指在一个国家经济领土内具有经济利益的经济…...

STM32H743+Radxa CM3异构架构3D打印机主控设计

1. 项目概述本项目是一款面向FDM型3D打印机的高性能主控系统,核心控制器采用意法半导体(STMicroelectronics)推出的STM32H743IIT6微控制器。该芯片基于ARM Cortex-M7内核,主频高达480 MHz,具备1 MB片上Flash与1 MB SRA…...

Kotaemon使用技巧:如何优化文档切片策略提升问答准确率?

Kotaemon使用技巧:如何优化文档切片策略提升问答准确率? 你是不是遇到过这种情况:用Kotaemon搭建了一个文档问答系统,上传了公司几十份产品手册,满怀期待地问它“我们的旗舰产品支持哪些操作系统?”&#…...

Bitwarden自建指南:用Cpolar实现内网穿透,打造个人密码管理服务器(群晖版)

Bitwarden私有化部署全攻略:基于群晖NAS与Cpolar的零门槛解决方案 在数字化生存成为常态的今天,密码管理已从可选项变为刚需。当LastPass连续发生安全事件、1Password被私募股权收购时,技术敏感型用户开始寻找更自主的数据管控方案。Bitwarde…...

Podman国内镜像加速终极指南:阿里云镜像源配置详解(2023最新版)

Podman国内镜像加速终极指南:阿里云镜像源配置详解(2023最新版) 如果你在使用Podman时遇到过镜像拉取缓慢的问题,那么这篇文章正是为你准备的。作为一款轻量级的容器引擎,Podman在开发者和DevOps工程师中越来越受欢迎。…...

ERNIE-4.5-0.3B-PT快速部署教程:vLLM+Chainlit 5分钟搭建文本生成服务

ERNIE-4.5-0.3B-PT快速部署教程:vLLMChainlit 5分钟搭建文本生成服务 想快速体验百度最新轻量级大模型ERNIE-4.5-0.3B-PT的强大文本生成能力吗?今天我就带你用最简单的方式,5分钟搭建一个完整的文本生成服务。不需要复杂的配置,不…...

AI绘画效率提升!Qwen-Image-2512-ComfyUI批量出图教程,省时省力

AI绘画效率提升!Qwen-Image-2512-ComfyUI批量出图教程,省时省力 1. 为什么选择Qwen-Image-2512-ComfyUI? 1.1 一键部署的AI绘画神器 Qwen-Image-2512-ComfyUI是阿里开源的最新图像生成模型与ComfyUI可视化界面的完美结合。这个预配置的AI算…...

LSTM从理论到实战:图解门控机制,推导梯度流,玩转时序预测

1. 为什么需要LSTM:从RNN的缺陷说起 第一次接触循环神经网络(RNN)时,我被它的"记忆能力"惊艳到了——当前时刻的输出不仅取决于当前输入,还会考虑之前所有时刻的信息。这就像我们人类理解句子时,需要结合上下文才能明白…...

从本地到云端:在阿里云ECS上构建YOLOv5实时检测服务的全链路实践

1. 从零开始:YOLOv5本地开发环境搭建 第一次接触YOLOv5时,我被它的速度和精度惊艳到了。这个由Ultralytics团队开发的目标检测模型,在保持轻量化的同时,性能丝毫不打折扣。下面我就带大家从最基础的本地环境搭建开始,一…...