数组名与指针的本质区别
在 C 语言中数组名和指针在语法和操作上有很多相似之处但它们本质上是不同的概念。理解它们的区别对于编写正确、高效的代码至关重要。以下从多个维度进行详细分析。一、核心概念与本质区别特性数组名指针本质数组的标识符代表整个数组的内存块。它是一个地址常量其值为数组首元素的地址。变量专门用于存储内存地址。其本身占用内存通常为4或8字节可以指向不同类型的数据。赋值操作不可赋值。数组名是常量不能出现在赋值运算符的左侧。例如int a[10]; a ...;是错误的。可以赋值。指针变量可以指向不同的内存地址。例如int *p; p x;是合法的。sizeof运算得到的是整个数组所占用的内存字节数。例如int arr[10]; sizeof(arr)通常为 10 * sizeof(int)。得到的是指针变量本身所占用的内存字节数即地址的长度。例如int *p; sizeof(p)在32位系统下为4字节64位系统下为8字节。运算符arr得到的是整个数组的地址。其值与arr首元素地址相同但类型不同如int (*)[10]vsint *。p得到的是指针变量自身的地址即二级指针。自增/自减不允许。因为数组名是常量不能进行arr或--arr等操作。允许。指针可以进行、--等算术运算以移动指向的内存位置。作为函数参数退化为指针。当数组名作为函数参数传递时它会退化为指向其首元素的指针。此时函数内部无法通过sizeof获取原数组大小。本身就是指针传递的是指针值的副本。二、代码示例与深入解析1. 声明与初始化int arr[5] {1, 2, 3, 4, 5}; // arr 是数组名代表一个有5个int的连续内存块 int *ptr arr; // ptr 是指针变量被初始化为指向arr的首元素arr[0]关键点ptr可以重新指向其他地方如ptr other_var;但arr始终指向那个大小为5的int数组的起始位置不能被改变。2.sizeof运算的差异#include stdio.h int main() { int arr[10]; int *p arr; printf(sizeof(arr) %zu , sizeof(arr)); // 输出40 (假设int为4字节10*440) printf(sizeof(p) %zu , sizeof(p)); // 输出4 或 8 (取决于系统位数) printf(sizeof(*p) %zu , sizeof(*p)); // 输出4 (解引用后是int类型的大小) return 0; }注释sizeof(arr)计算的是整个数组的大小而sizeof(p)计算的是指针变量本身的大小。3. 地址与指针运算#include stdio.h int main() { int arr[3] {10, 20, 30}; int *p arr; printf(arr %p , (void*)arr); // 输出数组首元素地址 printf(arr[0] %p , (void*)arr[0]); // 同上 printf(p %p , (void*)p); // 同上因为p指向arr[0] // 指针运算 printf(*(p1) %d , *(p1)); // 输出20 (等价于arr[1]) // 数组名也可以用于指针运算在表达式中会退化为指针 printf(*(arr1) %d , *(arr1)); // 输出20 (等价于arr[1]) // 但以下操作有本质区别 // p; // 合法p现在指向arr[1] // arr; // 非法编译错误数组名是常量不能自增 // 运算符的区别 printf(arr %p , (void*)arr); // 整个数组的地址值与arr相同但类型是 int(*)[3] printf(p %p , (void*)p); // 指针变量p自身的地址一个完全不同的地址 return 0; }4. 作为函数参数时的“退化”#include stdio.h void func1(int arr_param[]) { // 形参声明为数组但实际被编译器视为指针 // 警告此处sizeof(arr_param)是指针的大小不是原数组的大小 printf(Inside func1, sizeof(arr_param) %zu , sizeof(arr_param)); } void func2(int *ptr_param) { // 形参声明为指针 printf(Inside func2, sizeof(ptr_param) %zu , sizeof(ptr_param)); } int main() { int my_arr[100]; func1(my_arr); // my_arr 退化为指向 int 的指针 func2(my_arr); // 同上 return 0; }说明两种函数声明方式是等价的。在函数内部无法通过参数得知原始数组的长度通常需要额外传递一个长度参数。三、从编译器角度理解区别编译器在底层处理数组名和指针时有显著差异符号表信息当声明一个数组如int arr[10];时编译器会在符号表中记录arr是一个大小为10 * sizeof(int)的内存区域的标签。而声明指针如int *p;时符号表只记录p是一个指针类型的变量。地址计算对于数组访问arr[i]编译器生成的代码通常是*(arr的基地址 i * sizeof(元素类型))。这个基地址在编译时通常是已知的常量。对于指针访问p[i]编译器需要先从p所在的地址加载出它存储的地址值然后再进行同样的偏移计算。这意味着指针访问通常多一次内存读取操作。常量传播优化由于数组名是常量地址编译器可以进行更多优化例如将arr[5]直接计算为常量地址。而指针的值可能在运行时改变限制了此类优化。四、常见误区与易错点混淆char str[]和char *strchar str1[] Hello; // 在栈上分配一个数组并将字符串常量复制进去。str1可修改内容。 char *str2 World; // str2指向只读数据区的字符串常量。通过str2修改内容是未定义行为。 // str1[0] h; // 合法 // str2[0] w; // 可能引发运行时错误如段错误对二维数组名使用指针运算int matrix[3][4]; int (*p1)[4] matrix; // 正确p1是指向具有4个int的数组的指针 int **p2 matrix; // 错误类型不匹配二维数组名不是二级指针。误用sizeof在函数内部对作为参数传递进来的“数组名”实已退化为指针使用sizeof得到的是指针大小而非数组大小。这是常见的错误来源。五、总结与最佳实践场景建议需要知道数据集合大小使用数组或结构体包含数组以便利用sizeof在定义域内获取完整大小。需要动态内存分配或重指向使用指针配合malloc/free。函数参数传递“数组”实际上总是传递指针。同时传递数组长度作为另一个参数。可以使用int arr[]或int *arr声明形参前者更具可读性。需要遍历元素两者皆可。for(i0; ilen; i) arr[i]或for(parr; parrlen; p)。前者通常更清晰。定义字符串常量若不需修改使用const char *ptr literal;。若需修改使用char arr[] literal;。根本区别记忆口诀数组名是地址常量代表一块连续内存的起始标签指针是地址变量是一个可以存储和改变地址值的盒子。在大多数表达式中数组名会隐式转换退化为指向其首元素的指针但sizeof和操作是例外它们揭示了数组名的原始类型。理解这些区别有助于避免内存访问错误、编写更高效的代码并深入理解C语言的内存模型。参考来源嵌入式 C语言常见面试试题集锦C语言中数组名和指针的区别C语言中数组名和指针的区别及笔试题目【c语言】数组名和指针的区别从编译器角度分析C语言中数组名和指针的区别C语言指针与数组名,C语言指针和数组名区别

相关新闻

Unity与Unreal Engine实战对比:从核心原理到项目选型指南

Unity与Unreal Engine实战对比:从核心原理到项目选型指南

1. 项目概述:引擎之争下的开发者抉择 在游戏开发这个行当里,选引擎是个绕不开的经典话题,就像木匠选趁手的工具。Unity3D和Unreal Engine(虚幻引擎,简称UE)是当前市场上最主流的两大选择,几乎占…

2026/8/15 10:54:19 阅读更多 →
大模型技术解析:从Transformer架构到工程实践

大模型技术解析:从Transformer架构到工程实践

1. 大模型基础概念全景解析 大模型(Large Language Model)作为当前人工智能领域的核心技术范式,本质上是通过海量参数和训练数据构建的深度神经网络系统。这类模型的核心特征在于其规模——参数量通常达到百亿甚至万亿级别,训练数…

2026/8/11 15:06:06 阅读更多 →
连续性学习机制:从神经可塑性到动态知识图谱

连续性学习机制:从神经可塑性到动态知识图谱

1. 项目概述:重新理解学习机制的本质"自下而上的学习:连续性本身就是学习机制"这个标题直指现代学习理论的核心争议。作为一名在认知科学和教育技术交叉领域工作十二年的从业者,我亲历了从离散知识传授到连续性学习范式的转变过程。…

2026/8/11 12:14:26 阅读更多 →

最新新闻

OpenClaw AI智能体框架部署指南:从环境配置到实战应用

OpenClaw AI智能体框架部署指南:从环境配置到实战应用

1. 从零到一:OpenClaw到底是什么,以及为什么你需要它 如果你最近在AI智能体这个圈子里混,应该不止一次听到过“OpenClaw”这个名字。它不是什么新出的海鲜品牌,而是一个开源的、功能强大的AI智能体框架。简单来说,你可…

2026/8/16 4:05:11 阅读更多 →
Python开发实战:从环境管理到项目分发的全流程命令指南

Python开发实战:从环境管理到项目分发的全流程命令指南

1. 项目概述:为什么你需要一份“活的”命令手册 干了这么多年Python开发,我电脑里存过的“命令大全”没有十个也有八个了。每次看到“全网最全”、“建议收藏”这种标题,还是会忍不住点进去,结果往往是收藏夹里又多了一个再也不会…

2026/8/16 4:05:11 阅读更多 →
辊压成形技术:从原理到实践,掌握金属塑性成形的核心工艺

辊压成形技术:从原理到实践,掌握金属塑性成形的核心工艺

1. 从“压”到“形”:辊压成形技术的核心价值在制造业,尤其是金属加工领域,我们每天都在和“力”与“形”打交道。如何高效、精准地将一块平板金属变成结构复杂、性能优异的型材或零件,是工程师们永恒的课题。辊压成形&#xff0c…

2026/8/16 4:05:11 阅读更多 →
金钟壶红丝垂落,像把窑火留在月白上

金钟壶红丝垂落,像把窑火留在月白上

月白如初雪, 红丝自上垂。 钟形稳茶席, 窑火尚余晖。金钟壶的壶身低稳,轮廓像一口横向舒展的小钟。月白釉本来安静,肩部垂下的红紫细纹却像窑火留下的余迹,让整把壶一下有了精神。这把壶的重点,不在颜色多&…

2026/8/16 4:05:11 阅读更多 →
从OpenClaw看AI Agent三阶段进化:从工具编排到自主智能

从OpenClaw看AI Agent三阶段进化:从工具编排到自主智能

1. 从OpenClaw的爆火说起:我们到底在期待什么样的AI Agent?最近,如果你关注AI开发社区,一定被“OpenClaw”这个词刷屏了。从GitHub的Star数飙升,到各种“极速部署”、“入门玩法”的教程满天飞,再到开发者群…

2026/8/16 4:04:10 阅读更多 →
机器学习数据集全解析:从概念到实战应用

机器学习数据集全解析:从概念到实战应用

1. 从概念到实践:数据集的本质与价值如果你刚接触机器学习、数据分析或者任何与“智能”沾边的领域,第一个绕不开的词可能就是“数据集”。听起来很基础,对吧?但恰恰是这个最基础的概念,决定了你后续所有工作的上限。我…

2026/8/16 4:04:10 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →