理解指针与数组的学习历程————C语言难点

【C语言】我的23个C语言check list 今天整理桌子发现了几张纸,上面都是自己在学 阅读详情
AI摘要

本文通过分析数组传参、指针等效性及数组名的本质,澄清了C语言中指针与数组的关系。重点指出数组名通常退化为指向首元素的指针,但在sizeof和&操作中例外,并强调形参中arr[]本质上是指针传递,帮助开发者避免常见误区。

1.对于数组传参疑点

大家请看这一串代码

这是一个普通函数打印数组内容的代码  

  但在我刚学时,这平平无奇的代码对我却有一个疑惑,为什么实参传的是arr,而形参却用arr[ ]来接受呢?在我当时看来,arr[ ]是表示数组中的某个元素,而arr在学习scanf时老师提到过,数组名就是地址,那么为什么传的是地址,却用数组的某个元素来接收呢?这让我不能理解,只能记住且接受。

2.学习指针解决问题

在经过指针的学习之后,我们知道在C/C++中指针就是地址。

而上面说数组名arr就是地址,那数组名就是指针吗?

上面的疑问其实是源于对数组的理解不够深刻

其实,数组名是数组首元素的地址

而也有例外

*   sizeof(arr) → 整个数组大小

*   &arr           → 指向整个数组的指针(类型:int(*)[10])

(笔误,应该是40个字节)

 

有了上述知识,更好的帮我们了解了数组,现在我们解决最开始的疑问,再看下面两串代码

明明是不同的形式,却是输出相同的答案

   那么是否   arr[i]  与  *(p+i)    是等价的?

   那么是否   arr[i]  与  *(arr+i)    是等价的?

再回到数组传参

那么是否  int arr[ ]   与   int * arr  是等价的?

结果确实如此

3.得出结论

再次看下面的代码

经过再次学习,原来在编译时,arr[i]会被先转化为*(p+i)

  我对此的理解是,p是指向arr下标为0的指针,传参时arr是指向首元素的指针,而+i和[i]都表示指针的步长,解应用 * 与 [ ]都是在访问指针所指向的元素

原来

- 数组名 `arr` 在表达式中退化为指向首元素的指针(int*)

   有了此番知识与梳理,在以后写出数组传参与指针应用时,就会清晰许多,逻辑自然就通顺

4.总结经验与梳理使用技巧

 

一、核心疑惑:数组传参为啥形参用 arr[] ?

- 实参传的 arr (数组名),在表达式中退化为“数组首元素的地址”(本质是指针);
- 形参写 int arr[] 是C语言的“语法糖”,实际等价于 int *arr (都是接收指针);
- 所以 arr[] 不是“用数组元素接收地址”,而是指针的另一种写法。

二、数组名的2个关键例外(不会退化为指针)
1.  sizeof(arr) :此时 arr 代表“整个数组”,计算的是数组总字节数。

(比如 intarr[10] 的 sizeof(arr) 是40);
​
2.  &arr :此时 arr 代表“整个数组”,得到的是“指向整个数组的指针”(类型是 int (*)[10] ),而非首元素地址。
 
三、等价关系(新手必记)
 arr[i]   *(arr + i)  数组第i个元素(通过指针访问) 
形参 int arr[]  形参 int *arr  接收数组首元素的地址 
 
四、新手避坑提示
- 数组传参时,不能在函数内用 sizeof(arr) 算数组长度(此时 arr 是指针, sizeof(arr) 得到的是指针的字节数);
​
- 必须在主函数里先算好数组长度( sz = sizeof(arr)/sizeof(arr[0]) ),再传给函数。

 

 

                                                     (以上都是个人学习的见解,如有不妥,请指教)

 

C语言发展史:从Unix起源到现代标准演进 C语言从1970年代初诞生至今,历经半个世纪的发展,依然在系统编程、嵌入式开发等领域保持着强大的生命力。它的简洁、高效和对硬件的精确控制能力,使其成为了计算机科学史上最重要的编程语言之一。作为现代程序员,无论你专注于哪种编程领域,了解C语言及其发展历史都将为你提供更为深刻的技术视野和编程思维。作者:Despacito0o本文遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 阅读详情

相关推荐

深入理解C语言核心概念与应用

本文还有配套的精品资源,点击获取 简介:C语言是一种基础且功能强大的编程语言,以其简洁的语法、高效执行和广泛适用性而著称。本文汇集了C语言的关键技术知识点,包括数据类型、变量和常量、运算符、控制结构、函数、指针、数组、字符串、结构体、联合体、内存管理、预处理器、位操作和文件I/O等。通过详细解释这些概念,文章旨在帮助开发者打下坚实的编程基础,并为进一步的系统级编程和嵌入式开...

weixin_42601608的博客 1489

C语言学习之弹跳小球

重新回过头来看了一遍C语言,才发现我自己的无知,C语言其实好强大,我之前学的不过是一点C语法和做几个数学题。正好3月份的考试要考C语言,重新学一遍,先是在中国大学mooc上把翁恺老师的C语言刷了一遍,感觉对C有了个整体的了解,后面的数组,指针,文件流还是挺难的,还要多理解。 #include <stdio.h> #include <stdlib....

diecai2192的博客 554

OFDM基本原理

OFDM基础介绍,包括OFDM的核心思想,数学推导了OFDM信号的调制解调过程。

伊丽莎白的学习之路 8909

c语言指针历程

在指针类型中有一种特殊的类型是 void*类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。其实数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小单位是字节。其实数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小单位是字节。

2503_94479566的博客 592

山石网科Hillstone防火墙基础上网配置_CLI命令行(最新版)

山石网科Hillstone防火墙安全网关基础上网基础网络配置_CLI命令行(最新版)

路与肥的博客 1万+

keil4.72添加GD32F10x芯片

1. 下载 GD32F10x_AddOn_V2.0.1.rar,解压缩。 2. 安装 运行GigaDevice.GD32F10x_AddOn.2.0.0.exe 安装位置 再新建工程,发现已经有GD32F10x 3. 增加的文件分析 运行GigaDevice.GD32F10x_AddOn.2.0.0.exe后,在keil文件夹种增加文件如下: ...

TrueLink的博客 2762

初学C语言,有什么好书推荐?

全篇干货,我敢保证对你绝对有用。C语言是一种通用的,面向过程的高级编程语言,他以易于理解,简洁灵活,语法易读,成为了目前世界上最流行和最具影响力的语言之一。

BinSTD的博客 1万+

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5138

C语言中数组的分类

文仅仅简单介绍了C语言的数组,祝愿你我的朋友在学习的路上一帆风顺,也祝愿我会成为一个优秀的嵌入式工程师。

a15884871479的博客 3527

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1335

SOUL.md 人格定制的 7 个高阶技巧:Hermes Agent 精准控制 AI 行为模式

揭示 SOUL.md 的本质是行为契约而非人格设定,介绍7个围绕边界约束的高阶技巧,包括用上下文锚点(INPUT SCOPE/OUTPUT TARGET/CONSTRAINTS)替代角色描述、动态渲染锚点适配CI流程等,显著降低token消耗与人工review耗时。

weixin_42520239的博客 252

这才是你想要的C语言学习路线!

作为一门古老的编程语言,大家熟知它不仅是因为拥有48年的发展历程,更主要还是因为当下大部分程序员走入编程世界第一个学习的语言就是C语言。 而近年来高速发展的物联网和智能设备,又把C语言推向了风口浪尖,让它一举成为TOBLE 2019年度编程语言榜首。 熟悉C语言的程序员们更喜欢称C为“造轮子”的语言,因为它什么都能做。游戏公司后台开发、通信公司后台开...

人邮异步社区 3852

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

新手如何学好C语言?

作为一名资深码农,在软件行业也拼搏了十多年,这里跟想学习C语言的萌新童鞋分享下我的个人学习心得!!! 在大学时代,我们大二才开始学习C语言(起步有点晚啊),第一次看到那本黄黄的谭浩强老师的《c语言教程》,哈哈哈,就是这本了,满满的回忆啊! 开学拿到这本书后,心情很激动,因为以前总是羡慕那种黑客,好像很牛的样子, 抱着好奇的心理随便翻开了几页看了看,全程一脸懵逼, 因为以前从来没有接触过编程...

h a 6 6 6 c k 为 你解决复杂难题! 2976

深度解析:LPDDR5 采样 Mask 背后的秘密 —— 从 Jitter 到 BER 全面剖析

在 LPDDR5 中,CK/DQS 信号相当于“指挥棒”,而数据(DQ)要在时钟节拍里被准确采样。Crosspoint Mask 区域横轴:时间 (Time)纵轴:电压 (Vref)👉 只要采样点落在这个区域内,数据就是正确的。否则就会出错。BERPBERPMask 就像高速公路的收费站口,如果车(采样点🚗)在车道内,顺利通过;一旦跑偏,就撞护栏。LPDDR5 的速率极高,UI 非常短,Mask 区域成为核心指标各种 Jitter、Noise 会不断压缩 Mask。

weixin_43199439的博客 354

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

一篇文章帮你规划C语言从入门到进阶学习之路(书籍推荐)

一、C语言自我摸索之路 ​ 我是一名自动化的本科生,研究生也是学的控制科学与工程,因为在自动控制领域很多东西都是涉及的底层的控制,与硬件打交道比较多,所以学习的都是C语言。 初识C语言 ​ 首先就是和大家一样,在大一就学习了C语言,C语言的基础语法,如何编写最基本的程序,最后打印出来结果。在这个阶段没觉得C语言用来干嘛,有什么用,后来也就渐渐的忘记了。 偶遇C语言 ​ ...

HIT_zhanmusi的博客 3182

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一看就会的C语言入门指针(详解易懂)

室友一把王者荣耀的时间,你可以从新认识一下C语言指针!

爱德苏的博客 1284

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C语言的诞生与发展:开启现代程序设计的大门

《C语言的发展与应用概述》摘要: C语言诞生于1972年贝尔实验室,由Dennis Ritchie和Ken Thompson为开发UNIX系统而设计。其前身包括BCPL和B语言,C语言通过引入类型系统等改进解决了前代语言的局限性。经过C89、C99、C11到最新的C23等标准化版本迭代,C语言不断强化其高效性、可移植性和功能性。作为面向过程的高级语言,C语言以指针、结构体等特性著称,广泛应用于操作系统、嵌入式系统、游戏引擎等底层开发领域。学习C语言需要掌握从基础语法到系统编程的渐进路径,通过搭建开发环境并实

编程世界如山海,探索不止。 1万+

C 语言学习心得:编程之路的探索与感悟

通过学习 C 语言,我不仅掌握了一门强大的编程语言,更重要的是培养了自己的编程思维和解决问题的能力。学习结构体和共同体的过程中,我进一步体会到了 C 语言在数据类型定义方面的灵活性和强大性,能够根据具体问题的特点设计合适的数据结构来存储和处理数据。同时,我通过编写大量的代码示例,亲自实践指针的各种操作,观察内存的变化情况,逐渐加深对这些概念的理解。我相信,在未来的编程学习和实践中,C 语言所积累的知识和经验将成为我坚实的基础,让我能够在编程的道路上越走越远,探索更多未知的领域,创造出更加优秀的程序和作品。

qzkdA的博客 595

深刻理解C语言标准

前言 本文章内容有点长,建议耐心看完,会对C语言的语法有更深的印象。 C语言的起源 C语言起源于B语言,B语言起源于ALGOL(简称:A语言)。可以画图表示: A语言和B语言已经落伍了,我们可以不用管它们。 C语言的特点 C语言具有高效、强大而灵活,尤其在嵌入式开发。C语言比较靠近底层(除了汇编之外),学习它之后,学习任何语言都将事功半倍。 C语言的标准概述 C语言刚开始诞生的时候没有统一的标准,后来出现了一个K&R标准,但是这个标准并不完善。只定义了C语言而没有定义C库。 C89标准又可以成为A

q893332169的博客 2915

征服c指针_征服C指针(C程序员必读经典 原版畅销11年)

本书的目标与结构——引言0.1本书的目标在C语言的学习中,指针的运用被认为是最大的难关。关于指针的学习,我们经常听到下面这样的建议:“如果理解了计算机的内存和地址等概念,指针什么的就简单了。”“因为C是低级语言,所以先学习汇编语言比较好。”果真如此吗?正如那些C语言入门书籍中提到的那样,变量被保存在内存的“某个地方”。为了标记变量在内存中的具体场所,C语言在内存中给这些场所分配了编号(地址)。因此...

weixin_39634576的博客 596

C 语言概述

主要是通过看C Primer Plus书本,看郝斌老师的C语言课程,再参考其它博主的博客编写而成,仅供参考使用,欢迎大佬们批评指正!

学生一枚。 3166

C语言指针,我与你的爱恨情仇学习史

终于,在不断的努力下,我渐渐掌握了指针的基本用法,能够写出正确的代码,那种成就感油然而生,对指针也有了一丝好感。尝试编写简单的指针程序,结果错误连篇,编译时的报错信息仿佛在无情嘲笑我的无知。那一刻,对指针的恨达到了顶点,甚至怀疑C语言为什么要有这么复杂的东西。回顾与指针的这段学习历程,有恨得想放弃的时候,也有爱的无法自拔的瞬间。但正是这些爱恨情仇,让我在C语言的学习中不断成长,我相信,未来我们还会一起创造更多精彩。在C语言的学习旅程中,指针绝对是让我又爱又恨的存在,我们之间的故事,充满了曲折与起伏。

Jhao987654的博客 164

C 语言学习心得

通过参与一些小型的项目开发,我将所学的知识运用到实际场景中,不仅加深了对 C 语言的理解,还提高了自己的编程能力和解决问题的能力。同时,在面对项目中出现的各种挑战和错误时,我学会了如何冷静地分析问题、查找资料、尝试不同的解决方案,这种在实践中积累的经验是书本知识无法完全替代的。回顾这段 C 语言的学习历程,我深感这门语言对我的编程思维和能力的塑造是全方位的。不像一些高级语言有着丰富的库和便捷的框架,C 语言更像是一位质朴的工匠,给予程序员最基础的工具,让我们能够亲手打造出复杂的程序大厦。

NZzZzZN的博客 1122

C语言的学习路线

学习C语言是一段充实而有趣的旅程,通过系统的学习与实践,能够掌握这门强大的编程语言。在学习的过程中,持之以恒,勤加练习,定能在编程的道路上不断取得进步。希望本文的学习路线能够为你的C语言学习提供有效的指导和帮助。

2501_90770527的博客 711

C语言学习系列:初识C语言

语言,比如中文、英语、法语、德语等,是人与人交流的工具。C语言也是语言,不过是一种特殊的语言,是人与计算机交流的工具。?这就要从C语言的历史说起了。

epitomizelu的专栏 1324
下一篇: C语言指针深度实践:将各种指针剖析至尽
DDXYcoder
博客等级 码龄1年 140粉丝 29原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值