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

对于一维数组我们知道取地址是取首元素的地址,二维数组呢,地址是取第一行的地址,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));Cprintf("%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.rhkb.cn/news/279828.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript:void(0);用法及常见问题解析

文章目录 用法&#xff1a;常见问题解析&#xff1a;示例&#xff1a;用法补充&#xff1a;注意事项&#xff1a;替代方案示例&#xff1a;安全性考虑&#xff1a;替代方案建议&#xff1a;ES6语法替代&#xff1a;性能优化&#xff1a;最佳实践&#xff1a; 在 JavaScript 中&…

【双指针】算法例题

目录 二、双指针 25. 验证回文数 ① 26. 判断子序列 ① 27. 两数之和II - 输入有序数组 ② 28. 盛最多水的容器 ② 29. 三数之和 ② 二、双指针 25. 验证回文数 ① 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——差分进化算法(DE)

基于python语言&#xff0c;采用经典差分进化算法&#xff08;DE&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前已经成…

Docker简介与安装

简介 用来快速构建、运行、管理应用的工具简单说&#xff0c;帮助我们部署项目以及项目所依赖的各种组件典型的运维工具 安装 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \dock…

解决虚拟机Linux ens33 没有 IP 地址

解决方法&#xff1a; 先进入 root 模式 sudo su 查看目录 ls /etc/sysconfig 找到上述文件夹 ls /etc/sysconfig/network-scripts/ 用 vim 打开 ifcfg-ens33 这个文件&#xff08;不都是这个名字&#xff0c;按这个方法找到这个文件就行&#xff09; vim /etc/sysconfig/netw…

农业四情监测设备—全面、准确地收集农田环境数据

型号推荐&#xff1a;云境天合TH-Q3】农业四情监测设备是一种高科技的农田监测工具&#xff0c;旨在实时监测和管理农田中的土壤墒情、作物生长、病虫害以及气象条件。这些设备综合运用了传感器、摄像头、气象站等技术手段&#xff0c;能够全面、准确地收集农田环境数据&#x…

H264字节流编码格式

1.H264码流格式——字节流格式 字节流格式是大多数编码器&#xff0c;默认的输出格式。它的基本数据单位为NAL单元&#xff0c;也即NALU。为了从字节流中提取出NALU&#xff0c;协议规定&#xff0c;在每个NALU的前面加上起始码&#xff1a;0x000001或0x00000001&#xff08;0…

Nodejs 第五十八章(大文件上传)

在现代网站中&#xff0c;越来越多的个性化图片&#xff0c;视频&#xff0c;去展示&#xff0c;因此我们的网站一般都会支持文件上传。 文件上传的方案 大文件上传&#xff1a;将大文件切分成较小的片段&#xff08;通常称为分片或块&#xff09;&#xff0c;然后逐个上传这…

【3DsMax】UVW展开——以制作牙膏盒为例

效果 步骤 1. 从网上下载牙膏盒贴图&#xff0c;我下载的贴图地址为&#xff08;牙膏盒贴图链接&#xff09; 2. 打开3DsMax&#xff0c;创建一个长方体&#xff0c;设置长宽高分别为180、45、40毫米 打开材质编辑器&#xff0c;点击漫反射后的按钮 双击“位图” 将材质赋予长…

113 链接集10--ctrl+左键单击多选

1.ctrl+左键单击多选,单击单选 精简代码 <div class="model-list"><div@mousedown.prevent="handleClick(item, $event)"class="model-list-item"v-for="item in modelList":key="item.id":class="{ model-a…

QT6实现创建与操作sqlite数据库及读取实例(一)

一.Qt为SQL数据库提供支持的基本模块&#xff08;Qt SQL&#xff09; Qt SQL的API分为不同层&#xff1a; 驱动层 SQL API层 用户接口层 1.驱动层 对于Qt 是基于C来实现的框架&#xff0c;该层主要包括QSqlDriver&#xff0c;QSqlDriverCreator,QSqlDriverCreatorBase,QSqlPlug…

C++初阶 | [九] list 及 其模拟实现

摘要&#xff1a;介绍 list 容器&#xff0c;list 模拟实现&#xff0c;list与vector的对比 list&#xff08;带头双向循环列表&#xff09; 导入&#xff1a;list 的成员函数基本上与 vector 类似&#xff0c;具体内容可以查看相关文档(cplusplus.com/reference/list/list/)&…

UE4_官方动画内容示例1.1_使用动画资产

对一个SkeletalMeshActor进行设置&#xff0c;设置好之后&#xff0c;可以通过该Actor的细节&#xff08;Details&#xff09;面板播放指定的动画序列&#xff08;AnimationSequence&#xff09;资产&#xff08;例如让Actor翻跟斗并做开合跳&#xff09;。 骨架网格体定义&am…

后端系统开发之——接口参数校验

今天难得双更&#xff0c;大家点个关注捧个场 原文地址&#xff1a;后端系统开发之——接口参数校验 - Pleasure的博客 下面是正文内容&#xff1a; 前言 在上一篇文章中提到了接口的开发&#xff0c;虽然是完成了&#xff0c;但还是缺少一些细节——传入参数的校验。 即用户…

2024计算机二级Python6

在Python语言中局部变量可以是任意标识符&#xff0c;因为局部变量在函数结束时相当于被销毁&#xff0c;即使与全局变量同名也可以正常运行 在函数内部引用数字类型全局变量时&#xff0c;必须使用global保留字声明 函数内部引用组合类型全局变量时&#xff0c;可以不通过gl…

HTML实现卷轴动画完整源码附注释

动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=

Python之Web开发中级教程----ubuntu中下载安装Postman

Python之Web开发中级教程----ubuntu中下载安装Postman PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件&#xff0c;可以直接去对我们写出来的路由和视图函数进行调试&#xff0c;作为后端程序员是必须要知道的一个工具。 查看ubuntu系统中是否已经安装了…

微信小程序订阅消息(一次性订阅消息)

1、准备工作 登录微信公众平台–>订阅消息–>在公共模板库中选中一个模版–>将模版id复制&#xff0c;前后端都需要。 点击详情–>查看详细内容模版 复制给后端 2、相关api的使用 前端使用&#xff1a;wx.requestSubscribeMessage wx.openSetting wx.getSetti…

51单片机-蜂鸣器

1.蜂鸣器的介绍 无源蜂鸣器不能一直通电&#xff0c;无源蜂鸣器内部的线圈较小&#xff0c;易烧坏 蜂鸣器的驱动 达林顿晶体管&#xff08;npn型&#xff09; 应用&#xff1a; 按下独立按键同时蜂鸣器响起提示音&#xff0c;数码管显示对应的独立按键键码 #include <REG…

微信小程序 ---- 慕尚花坊 结算支付

结算支付 01. 配置分包并跳转到结算页面 思路分析&#xff1a; 随着项目功能的增加&#xff0c;项目体积也随着增大&#xff0c;从而影响小程序的加载速度&#xff0c;影响用户的体验。 因此我们需要将 结算支付 功能配置成一个分包&#xff0c; 当用户在访问设置页面时&a…