[C语言]一维数组二维数组的大小

news2025/1/15 14:02:27

对于一维数组我们知道取地址是取首元素的地址,二维数组呢,地址是取第一行的地址,sizeof(数组名)这里计算的就是整个数组的大小,&数组名 表示整个数组,取出的是整个数组的地址,显示的是数组的首元素

记住这些前提后,我们看一下下面的题目会多少呢?

一维数组计算大小题目

第一组题目

#include <stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));  
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
}

1、sizeof(a)是整个数组名所以为整个数组的大小,为4*4=16

2、sizeof(a+0)为首元素地址加0的元素地址既为1的地址,为4/8

3、sizeof(*a)是a的地址解码,是第一个元素1,大小为4

4、a+1是第二个元素的地址,同理也为4/8

5、a[1]也为第二个元素,大小为4

6、&a是去整个数组的地址,对于32地址线内存取4,对于64地址线内存取8

7、*&是取整个数组的地址再解码,因此sizeof里面就一剩一个数组名,大小为16

8、&a+1是区第二个元素的地址也为4/8

9、%a[0]是取第一个元素的地址,因此也为4/8

10、&a[0]+1是取第二个元素的地址,也为4/8

第一组题目完成了,我们来看看

第二组题目

#include <stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));C
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
}

1、arr为一个数组名,所以未整个数组的大小为6

2、arr+0代表了数组第一个元素地址,为4/8

3、*arr为数组第一个元素的值的大小为1

4、arr[1]也为数组第一个元素的值的大小为1

5、&arr是取数组arr的地址,大小为4/8

6、&arr+1是跳过了整个数组取下个地址的大小,既然是地址的大小输出的结果为4/8

7、&arr[0]+1为第二个元素的地址大小为4/8

8、strlen(arr)代表了求这个数组的字符长度,要看到'\0'strlen程序才会结束,而这个数组并没有'\0'所以其大小应为随机值

9、strlen(arr+0)也为和8一样的随机值

10、*arr是取数组地址的元素,strlen内部只能为地址,而其为元素,所以这个会显示错误

11、同10也会显示错误

12、&arr是取整个数组的地址,也是数组第一个元素的地址,和8、9一样是一样的随机值

13、&arr+1是跳过了整个数组后的第一个地址,取8、9不同是这个随机值比他们小6

14、地址是从第二个元素开始,所以输出的结果是比8、9小1

我们来看看这个程序运行结果是不是如此呢?

可以看到与我们预测的一样

第三组题目

#include <stdio.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
}

1、arr一样是整个数组的大小,但是这里记住以字符串命名会多一个'/0'所以这里的大小为7

2、sizeof(arr+0)代表了首元素的地址所以结果为4/8

3、*arr是指的首元素的值,大小为1

4、arr[1]是第二个元素的值大小为1

5、&arr是整个数组的地址,既然是地址大小就为4/8

6、&arr+1为跳过整个数组后的第一个元素的地址大小为4/8

7、&arr[0]+1为第二个元素的地址大小为4/8

8、strlen(arr)为数组的长度,这里有'\0'所以大小为6

9、strlen(arr+0)也是从首地址开始起算,所以大小也为6

10、11、这里都是取的元素,并不是地址,所以这里的值显示错误

12、&arr是整个元素的起始地址,大小也为6

13、&arr+1是整个数组后的第一个元素地址,这里计算字符串长度大小为随机值

14、&arr[0]+1是第二个元素的地址这里的大小为5

第四组题目

#include <stdio.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(p + 1));
	printf("%d\n", sizeof(*p));
	printf("%d\n", sizeof(p[0]));
	printf("%d\n", sizeof(&p));
	printf("%d\n", sizeof(&p + 1));
	printf("%d\n", sizeof(&p[0] + 1));
	printf("%d\n", strlen(p));
	printf("%d\n", strlen(p + 1));
	printf("%d\n", strlen(*p));
	printf("%d\n", strlen(p[0]));
	printf("%d\n", strlen(&p));
	printf("%d\n", strlen(&p + 1));
	printf("%d\n", strlen(&p[0] + 1));
}

这里注意命名的是char*命名,取得是后面字符串首元素地址

1、sizeof(p)为首元素地址的大小为4/8

2、是第二个元素地址的大小也为4/8

3、为首元素大小为1

4、为首元素大小为1

5、&p为首元素的地址大小为4/8

6、&p+1为第二个元素地址大小为4/8

7、&p[0]+1为第二个元素地址大小也为4/8

8、strlen(p)为首元素后找到'\0'为止的大小为6

9、为第二个元素后找到'\0'为止的大小为5

10、11、均为char类型的并不适用strlen所以会报错

12、&p是取得指针p的地址,这里计算出来的是随机值,这里并不是取p内指向的地址!

13、也为随机值,但不一定是随机值减1因为&p地址内存放的字符不一定

14、相当于取p[0]的地址再加1即为p[1]的地址大小为5,可以这么理解&(*p)+1

二维数组计算大小

#include <stdio.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0] + 1));
	printf("%d\n", sizeof(*(a[0] + 1)));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(*(a + 1)));
	printf("%d\n", sizeof(&a[0] + 1));
	printf("%d\n", sizeof(*(&a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));
	return 0;
}

我们知道二维数组的地址取的是第一行的地址,我们来看看这几个大小是多少

1、sizeof(a)里面是个数组名既计算整个数组的大小为3*4*4=48

2、sizeof(a[0][0])为第一行第一列元素大小为4

3、a[0]为第一行,里面只有一个数组名既为第一行的大小为1*4*4=16

4、a[0]+1为第一行首元素地址加1为第一行第二个元素地址的大小为4/8

5、*(a[0]+1)为第一行第二个元素地址的解引用为其整型的大小为4

6、a+1为第二行地址,地址的大小为4/8

7、*(a+1)为第二行地址的解引用即为第二行数组的大小a[1]大小为16

8、&a[0]+1为第一行的地址加1的大小为第二行的地址大小为4/8

9、为8第二行地址的存储数据大小为16

10、*a代表了第一行元素相当于a[0]大小为16

11、a[3]为第四行元素,注意这里的系统并未访问到第四行元素,sizeof里面的值不参与运算,但是系统会认为此数组存在第四行元素所以还是显示其大小为16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1530778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sqlite3安装

下载地址&#xff1a;SQLite Download Page windows下载下面两个选项 解压缩后将两个解压缩文件的内容放在一个文件夹下&#xff1a; 将该文件夹的路径添加到系统路径 在cmd下输入sqlite3显示以下内容说明安装成功 安装可视化工具&#xff1a;SQLiteStudio 安装完成后打开如…

软件推动开放自动化落地

当你唯一拥有的是一把锤子时&#xff0c;你周围的一切都是钉子。 软件是硬件设备的护城河&#xff0c;国际自动化厂商不遗余力地开发各种新型工业软件&#xff0c;其战略站在应用的制高点。以前我们追求硬件兼容&#xff0c;现在我们要致力于应用引领。如果我们拥有强大的SCADA…

C语言经典算法-7

文章目录 其他经典例题跳转链接36.排序法 - 改良的选择排序37.快速排序法&#xff08;一&#xff09;38.快速排序法&#xff08;二&#xff09;39.快速排序法&#xff08;三&#xff09;40.合并排序法 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三…

32串口学习

基于之前的GPIO等工程&#xff0c;后面的上手难度就简单多了&#xff0c;主要是相关寄存器的设置。 void USART1_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* config USART1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph…

好物分享:FPGA实现SDI视频编解码的方案设计汇总

目录 1、前言2、专用芯片方案2.1、GS2971FPGA的图像采集 设计方案2.2、GS2971FPGA的图像采集图像缩放 设计方案2.3、GS2971FPGA的图像采集纯verilog图像缩放纯verilog视频拼接 设计方案2.4、GS2971FPGA的图像采集HLS图像缩放Video Mixer视频拼接 设计方案2.5、GS2971FPGA的图像…

python爬虫之xpath入门

文章目录 一、前言参考文档&#xff1a; 二、xpath语法-基础语法常用路径表达式举例说明 三、xpath语法-谓语表达式举例注意 四、xpath语法-通配符语法实例 五、选取多个路径实例 六、Xpath Helper安装使用说明例子&#xff1a; 七、python中 xpath 的使用安装xpath 的依赖包xm…

基于VMware虚拟机安装MacOS BigSur系统

这周用VMWare搞了个MacOS虚拟机&#xff0c;也算是完成初中高中时候的梦想了吧~~&#xff08;那时候我的电脑配置还很拉跨&#xff0c;带不动虚拟机&#xff09;~~ 写一篇博客记录一下&#xff0c;当然这也是yonagi04.github.io建站的第一篇新博客 准备工作&#xff08;VMWare…

【Linux更新驱动、cuda和cuda toolkit】

目录 1. 更新显卡驱动1.1. 查看当前显卡驱动版本1.2. 删除原始显卡驱动1.3. 删除CUDA Toolkit1.4. 在NVIDIA官网找到2080Ti对应的最新驱动程序 2. 更新CUDA Toolkit2.1. 下载CUDA Toolkit2.2. 安装.run2.3. 添加环境变量2.4. 检查是否安装好了 最近需要更新服务器的显卡驱动和C…

yolov7 gui 轻松通过GUI来实现车辆行人计数

YOLOv7 GUI 是一款用户友好型图形界面应用程序&#xff0c;专为简化基于YOLOv7&#xff08;You Only Look Once version 7&#xff09;的目标检测流程而设计。该工具允许用户无需深入掌握命令行操作和复杂编程细节&#xff0c;即可方便快捷地运行YOLOv7模型来检测图像或视频中的…

精简版 Obsidian 图床配置 PicGo+ gitee

精简版 Obsidian 图床配置 PicGo gitee 图床的作用 图床&#xff08;Image Hosting Service&#xff09;是一种在线服务&#xff0c;用于存储和托管用户上传的图片文件。用户可以将图片上传到图床服务器&#xff0c;并获得一个可访问的图片链接&#xff0c;然后可以在网页、博…

NVIDIA最新 Blackwell架构简介

NVIDIA Blackwell架构简介 在AI和大型语言模型&#xff08;LLMs&#xff09;迅速发展的领域中&#xff0c;追求实时性能和可扩展性至关重要。从医疗保健到汽车行业&#xff0c;组织正深入探索生成性AI和加速计算解决方案的领域。对生成性AI解决方案的需求激增&#xff0c;促使企…

安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

视频监控平台问题-通过url免密直接浏览实时视频出错的问题解决

目 录 一、通过url免密浏览实时监控视频介绍 二、浏览出错现象描述 1、问题提出 2、问题描述 &#xff08;1&#xff09;现象 &#xff08;2&#xff09;前端调试 &#xff08;3&#xff09;后端日志 三、问题解决 1、问题分析 2&#xff0c;查找资源&#…

【MQTT】Vue中使用mqtt

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为一种轻量级、开放、灵活、简单、易于实现的通信协议。它基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的消息传输协议&#xff0c;在上位机和硬件设备间通信时经常用到。虽然在嵌入式软件一…

1、Java虚拟机学习-类的生命周期-加载阶段-以及怎样查看方法区中的对象和堆中对象的关联以及静态变量存在什么地方

类的生命周期 其中连接又可以分为3个小阶段 一、加载阶段 1、加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 渠道: 2、类加载器在加载完类之后&#xff0c;Java虚拟机会将字节码中的信息保存在内存的方法区中。 方法区是虚拟…

AI - 机器学习GBDT算法

目录 GBDT 提升树 梯度提升树 GBDT算法实战案例 XGBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; GBDT 梯度提升决策树&#xff08;Gradient Boosting Decision Tree&#xff09;&#xff0c;是一种集成学习的算法&…

基于springboot+vue的餐饮管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

GAMES101 学习3

Lecture 13 ~ 16 Shadow mapping 一种图像空间算法生成阴影时不需要知道场景中的几何信息会产生走样现象 最重要的思想&#xff1a;如果有的点不在阴影里你又能看到这个点&#xff0c;那么说明摄像机可以看到这个点&#xff0c;光源也可以看到这个点 经典的Shadow mapping …

提升合规性!Zoho如何优化CRM产品合规性?

在企业数字化和信息化高速发展的今天&#xff0c;CRM管理系统成为越来越多企业的选择。然而&#xff0c;不是所有CRM供应商都有合规意识。合规性不应当只是一项法律规定&#xff0c;更是保证CRM供应商持续发展、赢得客户信赖以及应付监管压力的关键支撑。Zoho对企业合规性的重视…

智能码垛机:企业高效物流管理的得力助手

在快速发展的现代企业中&#xff0c;高效物流管理不仅是提升竞争力的关键&#xff0c;更是降低成本、增加利润的重要手段。随着科技的进步&#xff0c;智能码垛机作为现代物流技术的重要组成部分&#xff0c;正日益成为企业实现高效物流管理的得力助手。 一、智能码垛机的工作原…