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

C语言入门:指针与数组的关系

数组名不是指针,可它偏偏总被当指针用,那它到底算个啥呢。

我学C语言快两个月了,光是“a

到底怎么算出来的”这个问题,就反复查了三回标准文档,问了两个同学,还扒了GCC的汇编输出。不是我不想弄懂,是网上太多说法自相矛盾——有的说“数组就是指针”,有的又说“根本不是”,连老师PPT上写的和教材小字批注都对不上。

后来我干脆拿纸笔画内存:`int a

= {1,2,3,4,5};`。我标出每个元素地址,手动算`a+2`是多少,再对照`&a

`,发现真的一样。但`&a`写在纸上时,我愣住了:地址数字和`&a

`并排写着,可我给它标类型时,硬生生多画了个括号,写成`int (*)

`——这玩意儿编译器认识,我一开始真不认识。

我试了`sizeof(a)`和`sizeof(&a)`,结果一个是20,一个是8。就这俩数字,让我盯了十分钟。20是5个int占的总空间,8是地址本身大小。原来“值一样”和“东西一样”真不是一回事。`a`不是变量,它没内存地址可存;`&a`也不是取“a这个符号”的地址,是取整个数组块的起始位置。

我写了个最简单的程序:

```c

int a

= {10,20,30};

printf("%p %p\n", (void*)a, (void*)&a);

```

运行结果两行地址一模一样。我差点又信了“它俩就是一回事”。直到我把`a+1`和`&a+1`打出来——前者是`a

`地址+4,后者直接跳了12字节(3×4)。这才明白,指针加1走多远,全看它指的“东西”有多大。`&a`指的不是int,是一整个`int

`,所以加1就跨过整个数组。

下标`a

`这事,课本说等于`*(a+i)`。我原来以为这只是写法不同,直到看godbolt.org里生成的汇编,`a

`和`*(a+i)`编译出来真的一条指令都不差。它不是“看起来像”,是编译器规定它就必须是。但`a++`为啥错?因为`a`根本不是能放地址的盒子,它连盒子都不是,是贴在内存块上的一张标签。你不能让标签自己动,但你能拿个新盒子(比如`int *p = a;`),把标签上的地址抄进去,再让盒子动。

函数传数组最骗人。我写`void f(int arr

10

)`,还傻乎乎在函数里`sizeof(arr)`,结果永远是8。我删掉10写成`int arr

`,还是一样。问了助教才懂:C标准白纸黑字写了,形参里的数组声明,编译器当场就替换成指针。它不存长度,不存边界,只存首地址。你传进去的是`a`,函数里拿到的是`a`转换后的`int *`,仅此而已。

陷阱真容易踩。有次我把`&a`直接赋给`int *p`,GCC警告我“类型不匹配”,我没理,结果程序跑一半崩了。后来加`-Wall`重编,警告清清楚楚写“initialization from incompatible pointer type”。还有一次越界访问`a

`,程序居然没报错,还打印出一个鬼数字,我真以为它“能用”。直到换台机器跑,直接段错误。UB不是吓唬人,是它真不管你会不会出事。

我拿`int (*p)

10

= &a;`和`int *q = a;`对比着写了几遍。前者`p+1`跳40字节,后者`q+1`跳4字节;`*p`是整个数组,`*q`只是一个int。要访问`a

`,用`q`是`q

`,用`p`得写成`(*p)

`——多一对括号,少一对就错。这不是绕口令,是类型系统在拉警报。

结构体里的数组让我又卡了一次。`struct { int x

; } s;`,我打`&s.x`和`&s.x

`,值一样,但类型一个是`int (*)

`,一个是`int *`。我试了`printf("%d", sizeof(&s.x));`,输出8;`sizeof(&s.x

)`也是8。但把它们传给函数,参数类型写错,编译器立马翻脸。

现在写代码前,我先想三件事:这个东西类型是啥?`sizeof`它多大?`&`它得到什么?想清楚了,`a

`、`p

`、`*(p+i)`在我脑子里就真成了一回事——不是“差不多”,是底层指令一模一样,只是写法不同。

我删掉了所有笔记里“数组就是指针”这几个字。改成:“数组名,在大部分地方,会自动变成指向第一个元素的指针,但它自己从来不是。”

今天用`-O2`编译三个遍历写法,看了汇编,三条`mov`指令排得整整齐齐,没差一个字节。

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

相关文章:

  • 2026年口碑好的学习月嫂机构推荐,乐到家家政在列 - 工业品牌热点
  • 豆包 专家 LeetCode 3045. 统计前后缀下标对 II Java实现
  • 抖音无水印视频下载器:终极技术实现与部署指南
  • 【数据库系统原理】第1篇:数据、信息与知识——数据库系统的历史使命
  • 2026浙江工业吊扇厂家怎么选?认准源头实力,优选东霸传动 - 新闻快传
  • 2026苏州昆山5家靠谱本地全屋定制软装品牌测评榜单:高端实木定制口碑推荐 - 新闻快传
  • 凤凰人家食品费用贵不贵 - mypinpai
  • Video2X 6.0.0完整指南:如何免费使用AI视频放大和帧率提升神器
  • 杭州抖佳信息技术有限公司知识图谱 - 新闻快传
  • 超深度测评!郑州靠谱黄金回收门店单出炉 - 新闻快传
  • 2026年艾默生涡旋压缩机厂家推荐:稳定高效与创新技术深度解析及选购指南 - 品牌企业推荐师(官方)
  • 藏友力荐!上海虹口区老银元回收+老银锭回收口碑店铺 - 沪上贵金属口碑推荐官
  • 2026论文降AIGC网站:11款工具实测谁更高效?
  • 【CSDN AI数字营销终极解密】:20年老炮亲测的5大核心能力与3个致命误区
  • MATLAB双馈风机仿真工具包:含平均模型与详细暂态模型,支持一键运行与对比分析
  • 超深度测评!西安靠谱黄金回收门店单出炉 - 新闻快传
  • 深度评测 2026 家电清洗培训,实力排名甄选优质培训班 - 湖南阳光技术
  • 从仿真到部署:基于快马平台实现工业级buck电源的实战开发
  • 适合猫咪的宠物食品正规品牌排行 选购参考指南 - 互联网科技品牌测评
  • 迎战2026年618电商节,实测产品不变形不走样的AI生图工具推荐 - 新闻快传
  • 免费桌面伴侣终极指南:如何用Mate Engine打造你的专属虚拟伙伴
  • 快马平台快速生成ER图工具原型,三步搞定数据库可视化设计
  • LabelLLM:开源数据标注平台如何解决大模型训练中的标注难题?
  • 2026年总氮标样口碑排名,云笈生物表现出色 - 工业品牌热点
  • 录播姬:开源免费的mikufans直播录制终极解决方案
  • 如何在所有Windows版本上使用Policy Plus进行高效组策略管理?
  • Atom 编辑器简体中文界面本地化技术实现与部署指南
  • 2026年同等学力申硕选购排名,搏硕汇有优势吗 - 工业品牌热点
  • 深度拆解:从 FP16 到 INT4,大语言模型(LLM)低比特量化的数学本质
  • 2026年 吸塑刀模厂家/品牌推荐:精准裁切与耐用性深度融合的行业优选刀具解析 - 品牌企业推荐师(官方)