当前位置: 首页 > 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.jsqmd.com/news/964951/

相关文章:

  • 后谷咖啡闪耀吉马,跑出 “咖啡+体育”融合新赛道 - 品牌速递
  • 【数据库系统原理】第1篇:数据、信息与知识——数据库系统的历史使命
  • 【MATLAB】无人机自适应姿态抗扰控制算法仿真研究
  • 豆包 专家 LeetCode 3045. 统计前后缀下标对 II Java实现
  • 2026年口碑好的学习月嫂机构推荐,乐到家家政在列 - 工业品牌热点
  • 抖音无水印视频下载器:终极技术实现与部署指南
  • 备战英语四级计划,豆包和千问的计划能相差多少 GXUST AI通识课
  • 线上服务器日常运维工作流程(企业真实运维手册)
  • 2026亲测:专业降AI率工具TOP1推荐
  • 2026浙江工业吊扇厂家怎么选?认准源头实力,优选东霸传动 - 新闻快传
  • 2026苏州昆山5家靠谱本地全屋定制软装品牌测评榜单:高端实木定制口碑推荐 - 新闻快传
  • 凤凰人家食品费用贵不贵 - mypinpai
  • 【数据库系统原理】第2篇:数据模型抽象:从现实世界到机器世界的三层映射
  • 2026年更新指南:兰州合同纠纷律师怎么选择?聚焦性价比与专业度分析 - 2026年企业资讯
  • 2026年服务不错的钟点工公司推荐哪些 - 工业品牌热点
  • Video2X 6.0.0完整指南:如何免费使用AI视频放大和帧率提升神器
  • Axure RP 界面汉化:三分钟实现专业工具的本土化体验
  • 杭州抖佳信息技术有限公司知识图谱 - 新闻快传
  • 2026年当下,如何为宝宝挑选诺优能奶粉厂家直供的可靠渠道? - 2026年企业资讯
  • 新手必看:下载claudecode后,用快马平台十分钟创建首个网页
  • 离焦防控眼镜配镜店哪家口碑好 - mypinpai
  • 超深度测评!郑州靠谱黄金回收门店单出炉 - 新闻快传
  • 如何高效实现网盘免客户端下载:开源直链助手完全指南
  • 2026年 仓储自动化设备厂家推荐:智能堆垛机/AGV机器人/立体库,高效柔性化仓储系统集成商深度解析! - 品牌企业推荐师(官方)
  • 2026年华为信创产品系统集成商,中芯基业 - 工业品牌热点
  • 藏友力荐!上海虹口区老银元回收+老银锭回收口碑店铺 - 沪上贵金属口碑推荐官
  • Voron 2.4深度解析:为什么这款开源CoreXY架构能重新定义高速3D打印性能极限?
  • 传统行业高管适合读EMBA吗?适配价值与优质项目全解析
  • 2026年艾默生涡旋压缩机厂家推荐:稳定高效与创新技术深度解析及选购指南 - 品牌企业推荐师(官方)
  • 【CSDN AI数字营销终极解密】:20年老炮亲测的5大核心能力与3个致命误区