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

tips图解数组名与指针的关系

在图解前需要先了解一下数组退化为指针的相关内容,下面先陈述数组退化为指针的概念、本质、以及什么情况下数组会退化为指针,什么情况下不会

概念定义

"数组名退化为指针"是C/C++语言中的一个重要特性,指的是数组名在大多数表达式中会自动转换为指向数组首元素的指针。这种转换由编译器自动完成,是一种隐式行为,使得对数组的操作更加灵活方便。

退化的本质

  • 数组名本身代表一块连续的内存空间,用于存储数据
  • 退化发生后,数组名失去其"数组"的身份特征,转变为指向数组首元素的右值指针(类似于const T*类型)
  • 退化后的指针值等于数组首元素的地址(即&arr[0])

发生退化的场景

1. 赋值给指针变量

int arr[5] = {1, 2, 3, 4, 5};
int* p = arr;// 等价于 int* p = &arr[0]

2. 作为函数参数传递

// 函数参数中的数组声明实际上等价于指针声明
void func(int param[]) {// 等价于 void func(int* param)// 此处的param是一个指针,而不是数组
}int main() {int arr[5];func(arr);// arr在这里退化为指针进行传递
}

3. 参与算术运算

arr + 1;// 等价于 &arr[1],指向数组的第二个元素

4. 用于比较运算

if (arr == &arr[0]) {// 比较结果为true
// 执行相应操作
}

退化的例外场景(数组名不退化)

1. 作为sizeof运算符的操作数

int arr[5];
printf("%zu", sizeof(arr));// 输出整个数组的大小(例如20,假设int类型占4字节)

2. 作为&(取地址符)的操作数

int arr[5];
int (*p_arr)[5] = &arr;// &arr是指向整个数组的指针,类型为int (*)[5]
// 注意:&arr的值与arr的值相同,但两者的含义完全不同
// arr + 1跳过一个元素的大小,而&arr + 1跳过整个数组的大小

3. 用于初始化字符数组的字符串字面量

char str[] = "hello";// str代表整个数组,sizeof(str)结果为6(包含终止符'\0')

图解一维数组(退化情况下)

图解一维数组

一维到二维(退化情况下)

图解二维数组

http://www.zskr.cn/news/8565.html

相关文章:

  • mysql查看数据库大小,可以通过查询系统表来实现
  • TPP21206替代MPQ8633,12A电流同步降压DCDC
  • kettle插件-kettle数据清洗插件,轻松处理脏数据
  • Java 如何在 Excel 中添加超链接?使用 Spire.XLS for Java 轻松实现 - 教程
  • RocketMQ vs RabbitMQ vs Kafka - 教程
  • 实用指南:设计模式概述
  • web应用程详解part1
  • 软工第二次作业之个人项目——论文查重
  • 对实体类Id自增
  • 深入解析:InnoDB存储引擎-锁
  • 20231326王荣盛《密码系统设计》第二周预习报告
  • Gitflow 工作流程
  • 魔改chromium真正通杀全网debugger检测
  • 【截稿倒计时、高录用、稳检索】2025年教育创新与信息技术国际学术会议(EIIT 2025)
  • hashcat高效爆破Wi-Fi密码方法(比aircrack-ng快)
  • 更新到macOS Sequoia后,chrome无法用ip访问192.168.*
  • Typora标题自动显示序号,大纲中也显示序号
  • 【IEEE出版、格林威治大学主办】第六届信息科学与并行、分布式处理国际学术会议(ISPDS 2025)
  • 【2025-09-18】工作情绪
  • Ubuntu 系统部署 LNMP 环境详细教程(附shell脚本一键部署↓) - 指南
  • 详细介绍:7HTMLCSS高级
  • C++学习笔记之输入输出流 - 教程
  • 使用Inno Setup打包安装程序exe流程
  • XXL-JOB-源码分享(1)
  • WPF 字符竖向排列的排版格式(直排)表明控件
  • 深入解析:HSA35NV001美光固态闪存NQ482NQ470
  • YOLO实战应用 1YOLOv5 架构与模块
  • SpringBoot整合RustFS:全方位优化文件上传性能
  • windows使用es-client插件
  • AI学习日记 - 实践