按照传统,先给结论:sizeof(数组名) 的值是这个数组所占据的内存的大小,单位是字节(bytes),在32位机器上,假设一个int型的数组a,里面一共有10个int类型元素,那么sizeof(a)的值就是10 * 4 = 40

原文链接:点击打开

sizeof是如何计算数组大小的

char *ptr;
char arr[10];
sizeof(ptr) =4;
sizeof(arr) =10;请问是如何计算数组大小的?这里只是把地址传给sizeof啊

严格讲,

sizeof(arr) =10; 这里只是把地址传给sizeof啊

你这句话是错误的,你传的是数组名,数组名不等价于地址

编译器用数组名标记数组的属性,比如具有确定数量的元素。
而你说的地址,也就是指针,只是一个标量值。

只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量:

  • sizeof(数组名):返回数组长度(所占的字节数,不是数组元素个数),而不是指向数组的指针的长度。

  • &数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。

以上内容来源:《C和指针》P141~142

sizeof(arr)这行不是程序执行到这里的时候才去求值的。所以不是你想的‘光凭指针如何知道数组长度’。
并且sizeof(arr)计算的数组所占字节数,并非数组长度,数组长度=sizeof(arr)/sizeof(char)

sizeof是关键字,是在编译阶段处理的。也就是说你程序没有运行前,sizeof(arr)就被替换成了一个固定的常量,保存在了test.out中了。你可以试试这样写 sizeof ptr也是不会报错的,这说明了sizeof不是函数。

你想验证的话可以分阶段编译,看下处理结果:
1.源文件:

#include<stdio.h>int main(){int a[10];int b = sizeof a;}

2.编译结果test.s
执行gcc -S test.c

你会发现编译阶段这里已经计算出了数组a的大小:40.
注意,这里的数组长度 = sizeof(a)/sizeof(int) = 40/4 = 10

c/c++ sizeof(数组名) 的解析 sizeof如何计算数组大小相关推荐

  1. 数组名的地址,和数组名取地址的讨论

    这个问题的发现是在以下的代码中发现的: #include<stdio.h> int main() {int arr[2]={1,2};printf("%p",arr); ...

  2. 对数组名取地址赋值给数组指针与普通指针的区别

    对数组名取地址赋值给数组指针与普通指针的区别: 以下红色字体的说法是错误的:     使用一级指针来接受&arr,只是表示一个普通的一级指针,     它并没有接收到&arr赋来的跨度 ...

  3. 解析:数组名a、数组名取地址a、数组首地址a[0]、数组指针*p

    数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼. 1 解析不同变量之间的区别: 数组名a: 数组名可以作为数组第一个元素的指针.我们由数组和指针的关系知道,a代表这个地址数值,它相当于一 ...

  4. C++ 数组名a、数组名取地址a、数组首地址a[0]、数组指针*p

    数组名a: 数组名可以作为数组第一个元素的指针.由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址.数组中的其他元素可以通过a的位移 ...

  5. java 如何操作字节数组_实例解析Java字节数组操作模式代码

    字节数组的关键是它为存储在这部分内存中的每个8位值提供索引(快速)和精确的原始访问,并且您可以操纵这些字节来控制每个位.缺点是计算机只将每个条目视为一个独立的8位数字--这可能是您的程序正在处理的,或 ...

  6. 数组名不等于指针---sizeof()函数求数组大小错误问题

    前言: 今天在项目中需要求采样点的数量并且遍历,采样点用数组存储,自定义了一个函数想要用sizeof求其长度,然后遍历,结果失败了,查阅之后发现以下问题: 在main函数中,sizeof是可以正常工作 ...

  7. C语言中 sizeof(数组名) 和 strlen(数组名) 的意义

    数组名是什么呢? 数组名通常来说是数组首元素的地址 但是有2个例外: 1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小 2. &数组名,这里的数组名表示整个数组, ...

  8. 【C语言数组】数组的创建和初始化 内存中的存储 冒泡排序 sizeof 数组名

    test 一.一维数组的创建和初始化 1.数组的创建 2.数组初始化 2.1.不完全初始化 2.2.不初始化 3.一维数组的使用 3.1.用下标打印1-10 3.2.sizeof 计算数组的元素个数 ...

  9. C语言初探——sizeof(数组名)与sizeof(*数组名)

    sizeof(数组名)与sizeof(*数组名) 举例 #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; printf(" ...

最新文章

  1. python快速编程入门例题-Python快速编程入门,打牢基础必须知道的11个知识点 !...
  2. Apache httpd服务
  3. 计算营业额的python代码_【每日一练】巧用python实现利润计算
  4. 清华开学,713分寒门学霸揭露一个真相:别抱怨读书苦,那是你看世界的路
  5. 95-138-010-源码-Function-KeyedProcessFunction
  6. python解决xml文件中存在中文文字的问题
  7. 设计模式之二-Proxy模式
  8. exchange2013 OWA界面使用公有计算机或私有计算机选项
  9. 第十届中国证券金紫荆奖名单揭晓 华能国际斩获两项大奖
  10. 利用AD13设计PCB的问题总结1-10
  11. 致谢zyf2000,仅是你的备份,留念和记录学习C++的足迹
  12. 生成yolov5.wts文件出错
  13. 安川机器人怎样与变位器编程_基于CAM Function的安川机器人弧焊焊接离线编程与离线仿真...
  14. 我的houdini无法查看节点属性WindowsError 234
  15. django.db.utils.OperationalError: (2003, Can't connect to MySQL server on ‘127.0.0.1’)
  16. HiPER 840负责均衡问题
  17. 为什么 A 能 ping 通 B,B 却不能 ping 通 A ?
  18. postgis+geoserver+openlayers最短路径分析-学习记录bug
  19. 成为诊断工程师,如何入门?
  20. QQ已经被恶意外挂破坏

热门文章

  1. 常用的Android反编译工具
  2. (附源码)基于springboot高考志愿选择系统-计算机毕设 68335
  3. 不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼)
  4. serdes channel bonding
  5. Nvidia Drive Orin/Drive AGX Orin DRIVE OS相关资源介绍
  6. python你好世界代码大全_Python菜鸟入阶第二步(编写hello world小程序)
  7. 【读书笔记】思辨与立场——思维就像学习芭蕾舞需要不断练习
  8. python-opencv实现调用实时摄像头进行图像处理(包含窗口的优化)
  9. Stirling公式【求解N!的位数】
  10. 简述:机房运维3D可视化平台