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

有关数组的学习

数组的概念简介数组是编程中最基础也最常用的数据结构之一理解它能帮你高效管理一组同类型的数据。1. 什么是数组核心概念同类型数组里的所有元素必须是相同的数据类型如全是int或全是float。连续内存数组在内存中是连续存放的这使得访问速度非常快。下标从 0 开始这是新手最容易犯错的地方第一个元素的下标是0最后一个元素的下标是长度 - 1。简单定义数组是一组相同数据类型的元素按固定顺序排列的集合通过索引可以快速访问任意元素。strcpy 是字符串赋值的首选代码简洁且安全。sprintf 功能更强但要注意目标数组长度足够避免溢出。memcpy 最底层适合精确控制内存但需手动保证字符串结束符\0否则可能输出乱码。函数数据类型是否自动加\0典型场景strcpyC 字符串以\0结尾✅ 自动添加字符串赋值、拼接sprintf格式化数据✅ 自动添加数字转字符串、多内容拼接memcpy任意内存块❌ 需手动处理二进制数据、固定长度数组复制2.指针和数组的区别指针和数组在 C 语言中是两个完全不同的概念。虽然它们在很多情况下可以“互换使用”比如访问元素时但它们的本质、内存分配和属性有着根本的区别。我们可以用一个比喻来理解数组就像是一排固定的连体别墅地址是写死在房产证上的你不能把整排房子搬到别处去。指针就像是一个可移动的箭头或路标它可以指向任何地方也可以随时改变指向甚至不指向任何东西空指针。 核心区别对比表特性数组 (Array)指针 (Pointer)本质一块连续内存区域的别名一个存储地址的变量可变性不可变。数组名是常量不能修改指向如a是错的可变。指针变量可以随意修改指向如p是对的内存大小sizeof(数组名) 整个数组占用的字节数sizeof(指针) 指针本身的大小32位系统4字节64位系统8字节定义位置通常在栈上分配固定大小全局数组在数据段可以在栈、堆或数据段指向任何类型的内存操作符a和a[0]值相同但类型不同p是指针变量自己的地址 代码实证为什么它们不一样让我们看一段代码来揭示真相#include stdio.h int main() { int arr[5] {1, 2, 3, 4, 5}; int *ptr arr; // ptr 指向数组的首元素 // 1. 自增操作测试 // arr; // ❌ 编译错误数组名是常量不能移动 ptr; // ✅ 合法指针向后移动了一个 int 的位置 // 2. sizeof 测试 (假设在 64 位系统) printf(sizeof(arr) %lu\n, sizeof(arr)); // 输出 20 (5个int * 4字节) printf(sizeof(ptr) %lu\n, sizeof(ptr)); // 输出 8 (指针本身的大小) // 3. 取地址测试 printf(arr %p\n, (void*)arr); // 整个数组的地址 printf(arr[0] %p\n, (void*)arr[0]); // 首元素的地址 (数值同上) printf(ptr %p\n, (void*)ptr); // 指针变量自己在内存中的地址 (完全不同) return 0; }关键点解析arr报错因为arr不是一个变量它是一个符号常量代表那块内存的起始位置你无法改变它。而ptr是个变量你可以让它指向arr[1]再指向arr[2]。sizeof不同这是最明显的区别。对数组用sizeof得到的是总容量对指针用sizeof得到的只是指针这个变量本身的大小与它指向多大的数组无关。ptr指针变量ptr自己也需要占用内存来存储地址所以ptr是存放“箭头”这个变量的地址而不是它指向的目标地址。 那为什么大家总觉得它们一样因为在表达式求值特别是下标访问时C 语言有一个特殊的规则数组名在大多数表达式中会自动“退化” (decay) 为指向其首元素的指针。当你写arr[i]时编译器实际上把它翻译成了*(arr i)。这时候arr暂时表现得像个指针所以arr[i]等价于ptr[i]*(arr i)等价于*(ptr i)但是这种“退化”只发生在运行时计算地址的时候并没有改变它们定义的本质。 经典陷阱示例// 文件 A: 定义数组 int arr[100]; // 文件 B: 错误地声明为外部指针 extern int *arr; // ❌ 错误类型不匹配如果你在另一个文件中把arr声明为extern int *arr程序链接可能通过但运行时会崩溃。因为编译器会尝试去读取arr所在内存地址里的值作为一个地址再去访问那个地址这完全是两码事。正确的声明应该是extern int arr[];。✅ 总结指针不是数组指针只是一个存地址的变量。数组也不是指针数组是一块连续的内存空间。关系数组名在计算时可以当作指针用但指针永远变不成数组指针不管理内存数组管理自己的内存。数组反转代码示例#include stdio.h int main() { // 1. 初始化数组 int arr[] {1, 2, 3, 4, 5}; int len 5; // 数组长度 printf(反转前: ); for(int i 0; i len; i) { printf(%d , arr[i]); } printf(\n\n); // 2. 核心反转逻辑双指针法 int left 0; // 左指针指向开头 int right len - 1; // 右指针指向末尾 (5-14) int temp; // 临时变量用于交换的“空杯子” // 只要左指针在右指针的左边就继续交换 while (left right) { // --- 开始交换 --- temp arr[left]; // 把左边的值存入临时变量 arr[left] arr[right];// 把右边的值赋给左边 arr[right] temp; // 把临时变量里的值原左边赋给右边 // --- 交换结束 --- // 移动指针向中间靠拢 left; // 左指针向右移 right--; // 右指针向左移 } // 3. 输出结果 printf(反转后: ); for(int i 0; i n; i) { printf(%d , arr[i]); } printf(\n); return 0; }一句话口诀数组是房子里的房间号固定不动指针是手中的地图可以随便换。 为什么 scanf 这么脆弱核心原理 scanf(%d, n) 的工作原理是 它去输入缓冲区看一眼。 如果是数字它吃掉数字存入变量返回 1成功。 关键点如果看到的是非数字比如字母 a它什么都不做 变量 n 不会被修改保持原来的垃圾值。 那个错误的字符 a 依然留在缓冲区里等着下一次读取。 它返回 0表示匹配失败没读到整数。 进阶思考如果想让用户“重试”而不是“退出”既然知道了 scanf 失败后错误字符会留在缓冲区那么想要重试必须手动把那个坏字符清理掉这是一个稍微高级一点的写法实现了“输错了可以重来”#include stdio.h int main() { int arr[10]; int i 0; int temp; // 用来丢弃非法字符 printf(请输入10个整数\n); while (i 10) { printf(请输入第 %d 个数: , i 1); // 尝试读取 if (scanf(%d, arr[i]) 1) { // 成功 i; // 只有成功了才处理下一个数 } else { // 失败 printf(❌ 输入错误那不是整数。\n); // 【关键步骤】清理缓冲区里的垃圾字符 // 一直读字符直到读到换行符 \n 或 文件结束 while ((temp getchar()) ! \n temp ! EOF); printf(请重新输入\n); } } // 后续统计逻辑... int count 0; for (i 0; i 10; i) { if (arr[i] % 2 0) count; } printf(偶数个数%d\n, count); return 0; }

相关文章:

有关数组的学习

数组的概念简介数组是编程中最基础也最常用的数据结构之一,理解它能帮你高效管理一组同类型的数据。1. 什么是数组?核心概念同类型:数组里的所有元素必须是相同的数据类型(如全是 int 或全是 float)。连续内存&#xf…...

Win10系统代理服务器拒绝连接?3步搞定网络恢复(附图文详解)

Win10代理服务器连接故障排查指南:从原理到实战解决方案 当Windows 10突然弹出"代理服务器拒绝连接"的错误提示时,很多用户会感到手足无措。这种情况通常发生在系统更新后、网络环境变更时,或是某些应用程序擅自修改了系统设置。本…...

Chandra AI性能调优:GPU显存优化全攻略

Chandra AI性能调优:GPU显存优化全攻略 1. 引言 跑大模型最头疼的是什么?对,就是那个让人又爱又恨的GPU显存!明明买了张不错的显卡,结果跑个模型就提示"Out of Memory",这种经历想必很多朋友都…...

解锁DeerFlow:零基础搭建智能研究环境完全指南

解锁DeerFlow:零基础搭建智能研究环境完全指南 【免费下载链接】deer-flow DeerFlow is a community-driven framework for deep research, combining language models with tools like web search, crawling, and Python execution, while contributing back to th…...

3分钟上手!FrankMocap让普通摄像头变身专业动捕设备

3分钟上手!FrankMocap让普通摄像头变身专业动捕设备 【免费下载链接】frankmocap A Strong and Easy-to-use Single View 3D HandBody Pose Estimator 项目地址: https://gitcode.com/gh_mirrors/fr/frankmocap 在数字内容创作与交互设计领域,3D动…...

如何快速上手艾尔登法环存档编辑器:新手完整指南

如何快速上手艾尔登法环存档编辑器:新手完整指南 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor ER-Save-Editor是一款专为《艾尔登…...

电脑风扇智能控制完全指南:从噪音烦恼到散热优化

电脑风扇智能控制完全指南:从噪音烦恼到散热优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…...

阿里云服务器上Certbot更新Let‘s Encrypt证书总超时?一个更换公网IP的实战解决记录

阿里云服务器Certbot更新Lets Encrypt证书超时问题深度解析与实战解决 最近在阿里云北京区域的服务器上更新Lets Encrypt证书时,遇到了一个看似简单却令人困扰的问题:Certbot在续签证书时频繁报错,提示acme-v02.api.letsencrypt.org连接超时。…...

硬件突破:用OpenCore Legacy Patcher实现旧Mac的焕新体验

硬件突破:用OpenCore Legacy Patcher实现旧Mac的焕新体验 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大的开源工具&#…...

C# rtwpriv Wi-Fi定频工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、使用简介,说明#前言 对于无线产品,很多需要做CE,FCC,SRRC等认证,需要测试RF,像Realtek方案的Wi-Fi用到rtwpriv工具…...

CentOS7服务器流量飙升?别慌,用iftop+nload快速揪出‘吃流量’的进程

CentOS7服务器流量异常排查实战:iftop与nload组合拳 深夜的告警铃声突然响起,监控系统显示某台核心业务服务器的带宽使用率飙升至95%。作为运维人员,这种场景并不陌生——可能是业务量激增,也可能是恶意攻击,或是某个失…...

攻克Windows安装难题:AtlasOS全方位解决2502/2503错误的技术方案

攻克Windows安装难题:AtlasOS全方位解决2502/2503错误的技术方案 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Tren…...

YOLO12快速部署教程:无需配置,一键启动Web检测界面

YOLO12快速部署教程:无需配置,一键启动Web检测界面 1. 引言 目标检测技术作为计算机视觉领域的核心任务之一,在安防监控、自动驾驶、工业质检等领域有着广泛应用。YOLO系列模型因其出色的实时性能一直备受关注,而最新发布的YOLO…...

Fritzing电子设计软件:从原型到PCB的完整开源解决方案

Fritzing电子设计软件:从原型到PCB的完整开源解决方案 【免费下载链接】fritzing-app Fritzing desktop application 项目地址: https://gitcode.com/gh_mirrors/fr/fritzing-app Fritzing是一款功能强大的开源电子设计自动化(EDA)软件…...

YOLOv8在智慧农业中的落地实践:如何提升植物病害检测准确率到90%+

YOLOv8在智慧农业中的落地实践:如何提升植物病害检测准确率到90% 在智慧农业领域,植物病害的早期识别与精准诊断一直是技术攻关的重点。传统人工检测方式不仅效率低下,而且受限于专家经验,难以实现规模化应用。随着计算机视觉技术…...

Vue3+Tauri实战:从零构建桌面聊天应用,仿微信核心功能解析

1. 为什么选择Vue3Tauri开发桌面应用 最近两年桌面应用开发领域出现了一个有趣的现象:传统Electron应用虽然依然流行,但开发者们开始寻找更轻量、性能更好的替代方案。这就是Tauri逐渐受到关注的原因。作为一个长期使用Electron的老手,我第一…...

AIVideo效果震撼:输入‘量子计算科普’生成带3D动画与专家语音的12分钟视频

AIVideo效果震撼:输入‘量子计算科普’生成带3D动画与专家语音的12分钟视频 只需输入一个主题词,就能自动生成包含专业分镜、精美画面、专家级配音的完整长视频——AIVideo让视频创作变得如此简单。 1. AIVideo:一站式AI视频创作革命 当我第…...

FUTURE POLICE赋能在线教育:AI助教自动批改口语作业

FUTURE POLICE赋能在线教育:AI助教自动批改口语作业 每次上完英语口语课,最头疼的是什么?对很多学生来说,是等待老师批改作业的漫长过程,还有那千篇一律的“发音不错,继续努力”的反馈。对老师而言&#x…...

文墨共鸣应用场景:高校思政课教案语义重复检测与创新性评估

文墨共鸣应用场景:高校思政课教案语义重复检测与创新性评估 1. 引言:当传统思政课遇上AI语义分析 高校思政课教师每年都要准备大量教案,从经典理论阐释到时事热点分析,内容创作压力不小。一个常见的问题是:不同章节的…...

模型微调加持:百川2-13B+OpenClaw定制化个人助手实践

模型微调加持:百川2-13BOpenClaw定制化个人助手实践 1. 为什么需要定制化个人助手? 去年我尝试用现成大模型搭建自动化助手时,发现一个尴尬现象:当我让AI帮我整理会议纪要时,它总把技术术语解释得像科普读物&#xf…...

vLLM-v0.17.1助力Java微服务:高并发下的模型推理集成方案

vLLM-v0.17.1助力Java微服务:高并发下的模型推理集成方案 1. 引言:当Java微服务遇见大模型推理 最近两年,大模型技术在企业应用中的落地速度远超预期。作为Java开发者,我们可能已经习惯了SpringBoot生态的舒适区,但当…...

从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析

1. RK3588与FPGA的PCIe通信基础 在嵌入式开发中,RK3588作为一款高性能处理器,与FPGA的协同工作越来越常见。PCIe(Peripheral Component Interconnect Express)作为一种高速串行计算机扩展总线标准,能够提供高带宽、低延…...

OpenClaw多模态扩展:Qwen3.5-4B-Claude分析截图内容

OpenClaw多模态扩展:Qwen3.5-4B-Claude分析截图内容 1. 为什么需要截图分析能力 上周我在整理项目文档时遇到了一个典型问题:客户发来的需求变更截图散落在十几个微信对话中,我需要手动对照图片内容更新PRD文档。这种机械操作不仅耗时&…...

别再踩坑了!CentOS Stream 9下IPXE源码编译保姆级教程(附gcc版本对照表)

CentOS Stream 9下IPXE源码编译全指南:从版本陷阱到高效实践 最近在自动化装机项目中,我不得不面对一个看似简单却充满陷阱的任务:编译IPXE引导文件。本以为按照网上教程半小时就能搞定,结果却在各种版本兼容性问题中挣扎了两天。…...

Meta Manus vs OpenClaw:2026年AI Agent之战,谁才是你的最佳选择?

## 引言2026年AI Agent市场迎来爆发式增长,预计到2034年将达到1400亿美元规模。在这个赛道上,Meta的Manus和开源项目OpenClaw成为最受关注的两大竞争者。本文将深入分析两者的差异,帮助你做出最佳选择。## Meta Manus:巨头的入场#…...

Isaac Sim物理参数全解析:从碰撞器到SDF的实战配置指南

Isaac Sim物理参数全解析:从碰撞器到SDF的实战配置指南 在机器人仿真和虚拟环境构建领域,物理参数的精确配置往往是决定仿真效果真实性的关键因素。NVIDIA Isaac Sim作为业界领先的机器人仿真平台,其物理引擎提供了丰富的参数体系&#xff0…...

zwq的模板

为了使zwq的编码习惯更规范,方便与不同模板之间的配合,特此开始这一项宏大的工程,把各种模板综合起来,并使用统一的变量名,未来将会做很多修改,可能比较混乱。每份代码都是笔者手敲的。 目录 一.代码模板 …...

Qwen2-VL-2B-Instruct模型压缩实战:使用量化工具减小部署体积与加速推理

Qwen2-VL-2B-Instruct模型压缩实战:使用量化工具减小部署体积与加速推理 最近在折腾一个边缘设备上的视觉项目,用上了Qwen2-VL-2B-Instruct这个多模态模型。模型效果确实不错,但原始大小接近8GB,推理速度也慢,在资源有…...

ngx_queue_sort

1 定义 ngx_queue_sort 函数 定义在 ./nginx-1.24.0/src/core/ngx_queue.cvoid ngx_queue_sort(ngx_queue_t *queue,ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) {ngx_queue_t *q, *prev, *next;q ngx_queue_head(queue);if (q ngx_queue_last(queue)) {r…...

GLM-OCR与LSTM网络融合实践:提升连续手写体文本识别效果

GLM-OCR与LSTM网络融合实践:提升连续手写体文本识别效果 最近在折腾一个挺有意思的项目,朋友那边有个需求,要识别一些手写的病历和处方。你懂的,医生那笔迹,龙飞凤舞,连笔连得飞起,传统的OCR工…...