news 2026/9/15 14:56:13

【C++指针】 数组名与指针:为什么datas和sizeof(datas)的行为不同?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++指针】 数组名与指针:为什么datas和sizeof(datas)的行为不同?

一、困惑现场

这段代码有什么问题?

structXData;XData datas[3];unsignedcharbuf[1024]={0};memcpy(buf,&datas,sizeof(datas));

疑问:

  1. datas不就是指针吗?为什么用&datas
  2. sizeof(datas)不是4(指针大小)吗?为什么是数组大小?

二、先看一个简单实验

#include<iostream>usingnamespacestd;intmain(){intarr[5]={1,2,3,4,5};cout<<"arr 的值: "<<arr<<endl;// 输出地址cout<<"&arr 的值: "<<&arr<<endl;// 也是地址cout<<"arr + 1: "<<arr+1<<endl;// 下一个int的地址cout<<"&arr + 1: "<<&arr+1<<endl;// 跳过整个数组cout<<"sizeof(arr): "<<sizeof(arr)<<endl;// 20 (5*4)cout<<"sizeof(&arr): "<<sizeof(&arr)<<endl;// 8 (指针大小)return0;}

输出结果:

arr 的值: 0x7ffc12345670 &arr 的值: 0x7ffc12345670 arr + 1: 0x7ffc12345674 &arr + 1: 0x7ffc12345684 sizeof(arr): 20 sizeof(&arr): 8

三、核心概念:数组名的两种身份

概念1:数组名是首元素地址

intarr[5]={1,2,3,4,5};// arr 是首元素地址int*p1=arr;// ✅ 正确:arr可以赋值给int*p1[0]=100;// 修改第一个元素// arr 不是指针变量,是常量地址// arr = p1; // ❌ 错误:不能修改arr

概念2:&数组名是整个数组的地址

intarr[5];// arr : int* 类型,指向第一个元素// &arr : int(*)[5] 类型,指向整个数组int*p1=arr;// ✅ int* = int*int(*p2)[5]=&arr;// ✅ 数组指针 = &数组名cout<<sizeof(arr)<<endl;// 20:整个数组的大小cout<<sizeof(&arr)<<endl;// 8:指针的大小

四、图解:arr 和 &arr 的区别

内存布局: arr[0] arr[1] arr[2] arr[3] arr[4] [1] [2] [3] [4] [5] 0x100 0x104 0x108 0x10C 0x110 arr (首元素地址) → 0x100 (指向int) &arr (数组地址) → 0x100 (指向整个5个int的数组) arr + 1 → 0x104 (跳过一个int) &arr + 1 → 0x114 (跳过整个数组,5*4=20字节)

五、为什么 memcpy 要用 &datas?

错误写法

XData datas[3];memcpy(buf,datas,sizeof(datas));// ❓ 这样写对吗?

这其实是可以工作的,因为:

  • datas是首元素地址
  • sizeof(datas)是整个数组的大小

为什么用 &datas 更准确?

memcpy(buf,&datas,sizeof(datas));// ✅ 更准确的写法

理由:

  • &datas明确表示"整个数组的地址"
  • 类型是XData(*)[3],强调这是整个数组
  • datas只是首元素地址,类型是XData*

两者的值相同,但类型不同

cout<<(void*)datas<<endl;// 0x100cout<<(void*)&datas<<endl;// 0x100(相同的地址)// 但类型不同// datas : XData*// &datas : XData(*)[3]

六、sizeof 的魔法

为什么 sizeof(datas) 是数组大小?

XData datas[3];// sizeof 是编译时运算符,不是函数!size_t size=sizeof(datas);// = 3 * sizeof(XData)// 原理:编译器知道 datas 是数组类型 XData[3]// 所以在编译时就能计算出整个数组的大小

对比验证

voidtestArray(XData datas[]){// 这里的 datas 已经变成指针了!cout<<sizeof(datas)<<endl;// 输出 8(指针大小)}intmain(){XData datas[3];cout<<sizeof(datas)<<endl;// 输出 3 * sizeof(XData)testArray(datas);// 输出 8}

七、记忆口诀

数组三连

  • 数组名是地址:指向第一个元素
  • &数组名也是地址:指向整个数组
  • sizeof数组名:整个数组的大小

地址计算

  • arr + 1:跳到下一个元素
  • &arr + 1:跳到整个数组后面

拷贝数组

  • 目标:&arr(更准确)
  • 大小:sizeof(arr)(整个数组)

八、面试常考

问题1:下面代码输出什么?

inta[5]={1,2,3,4,5};int*p=(int*)(&a+1);printf("%d",*(p-1));

答案:5

  • &a + 1跳过整个数组,指向数组后面
  • 转成int*再减1,指向最后一个元素

问题2:sizeof 在数组和指针上的区别

intarr[10];int*p=arr;sizeof(arr);// 40 (10*4)sizeof(p);// 8 (指针大小)

数组名有两个身份:作为首元素地址时像指针,作为数组名时代表整个数组。&数组名强调"整个数组"的身份,sizeof(数组名)计算整个数组的大小。memcpy用&数组名是为了语义清晰:我要拷贝整个数组!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 19:02:35

标题:外网炸锅!一张年夜饭照片,击穿了外国人的认知天花板

标题&#xff1a;外网炸锅&#xff01;一张年夜饭照片&#xff0c;击穿了外国人的认知天花板一张普通的手机随手拍&#xff0c;直接把外网热搜干爆&#xff0c;评论区上演大型 “认知崩塌” 现场。一张中国家庭的年夜饭照片&#xff0c;没有滤镜&#xff0c;没有布景&#xff0…

作者头像 李华
网站建设 2026/9/8 7:43:46

字体大数据:从搜索频次TOP10看国内设计行业五大场景需求

你知道国内设计师搜索频率最高的10套字体&#xff0c;都是什么吗&#xff1f;字体被反复搜索&#xff0c;这背后不止是个人喜好&#xff0c;更反映了设计行业的普遍痛点与企业用字的真实需求。字由作为一款有千万设计师用户熟知并使用的字体软件&#xff0c;根据2025年度的平台…

作者头像 李华
网站建设 2026/9/8 7:32:21

在线培训考试系统哪个好?全维度选型指南与深度解析

一、行业现状与核心痛点&#xff1a;基于权威数据的深度洞察在企业数字化转型持续深化的背景下&#xff0c;培训考试系统已成为组织人才培育、合规管理、能力建设的核心基础设施。据中国企业数字化转型协会《2025-2026 中国企业培训数字化发展白皮书》数据显示&#xff0c;2025…

作者头像 李华
网站建设 2026/9/15 7:00:54

用过才敢说!专科生必备的降AIGC网站 —— 千笔·降AIGC助手

在AI技术快速发展的今天&#xff0c;越来越多的专科生开始借助AI工具辅助论文写作&#xff0c;以提高效率和内容质量。然而&#xff0c;随之而来的“AI率超标”问题却让许多学生陷入困境——随着查重系统对AI生成内容的识别能力不断提升&#xff0c;论文一旦被判定为AI痕迹过重…

作者头像 李华
网站建设 2026/9/8 6:38:22

Si8261ABC-IS,采用低功耗二极管仿真器且引脚兼容光耦驱动器

型号介绍今天我要向大家介绍的是 skyworks 的隔离驱动器——Si8261ABC-IS。它能够承受高达 5000 VRMS 的隔离电压&#xff0c;并具备 10 kV 的浪涌耐受能力&#xff0c;这意味着它能够在恶劣的工业环境中可靠地工作。其次&#xff0c;它拥有 60 ns 的快速传播延迟&#xff0c;不…

作者头像 李华
网站建设 2026/9/10 4:16:32

基于PLC的喷泉控制系统设计商品介绍

基于plc的喷泉控制系统设计本商品为电子程序资料商品包基于plc的喷泉控制系统设计本商品为电子程序资料 商品包含内容&#xff1a;①花式喷泉博途PLC与HMI仿真工程 (博途V14或以上) 一份&#xff1b;②花式喷泉配套有IO点表PLC接线图控制流程图 (CAD源文件可编辑);③花式喷泉博…

作者头像 李华