[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.mzph.cn/news/757994.shtml

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

相关文章

网络工程师练习题2

网络工程师 将专用IP地址转换为公用IP地址的技术是&#xff08;&#xff09;。 A.ARPB.DHCPC.UTMD.NAT 【答案】D 【解析】概念题&#xff0c;NAT技术将源地址从内部专用地址转换成可以在外部Internet上路由的全局IP地址。 R1、R2是一个自治系统中采用RIP路由协议的两个相…

【计算机网络篇】物理层(4)信道的极限容量,信道复用技术

文章目录 &#x1f354;信道的极限容量&#x1f6f8;造成信号失真的主要因素⭐码元的传输速率 &#x1f6f8;奈氏准则&#x1f6f8;香农公式&#x1f388;练习 &#x1f5d2;️小结 &#x1f354;信道复用技术⭐常见的信道复用技术&#x1f388;频分复用FDM&#x1f388;时分复…

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CEEMDAN方法的分解效果取决于白噪声幅值权重(Nstd)和噪声添…

【刷题】滑动窗口入门

送给大家一句话&#xff1a; 那脑袋里的智慧&#xff0c;就像打火石里的火花一样&#xff0c;不去打它是不肯出来的。——莎士比亚 滑动窗口入门 认识滑动窗口Leetcode 209. 长度最小的子数组题目描述算法思路 Leetcode 3. 无重复字符的最长子串题目描述算法思路 Leetcode 1004…

部署应用到K8s集群(未完)

&#xff08;等熟悉一番再来写&#xff0c;因为按小时结算的。。。&#xff09; 1 、 kubectl run 启动 nginx 应用 kubectl run nginx --imagenginx:latest 2、将本地机器的80端口转发到集群中名为nginx的Pod的80端口 kubectl port-forward --address 0.0.0.0 pod/nginx 80:8…

AHI对MySQL性能的影响

MySQL中出现很多latch锁&#xff0c;而这个很大程度上和MySQL自适应hash索引有关。 AHI概述 MySQL InnoDB存储引擎的自适应哈希&#xff08;Adaptive Hash Index&#xff0c;下简称AHI&#xff09;功能 若用户的访问模式基本都是类似KV操作的点查询&#xff08;point select&…

es bulk批量操作简单实例

&#xff08;1&#xff09;定义 bulk允许在单个步骤中进行多次create、index、update或delete请求。 bulk与其他的请求体格式稍有不同&#xff0c;如下所示&#xff1a; { action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body …

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS…

【CSS】html滚动条相关

1.滚动条样式 ::-webkit-scrollbar {width: 10px;height: 10px;z-index: 101; } ::-webkit-scrollbar-thumb {border-radius: 5px;background: #cecece; } ::-webkit-scrollbar-track {// background: #f5f5f5be;background: rgba(33, 85, 163, 0); } ::-webkit-scrollbar-but…

python汽车租赁系统的设计与实现flask-django-php-nodejs

困扰公司的许多问题当中,汽车租赁管理一定是公司不敢忽视的一块。但是管理好汽车租赁又面临很多麻烦需要解决,例如有几个方面:第一,公司往往汽车数量都比较多,如何保证能够管理到每一汽车;第二,如何在工作琐碎,记录繁多的情况下将汽车租赁的当前情况反应给公司领导相关部门决策…

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

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

常用小知识点总结

1. pc可以跑通&#xff0c;但是安卓编译死循环&#xff0c;可能是函数声明了返回类型&#xff0c;但是没有真正返回 2. ubuntu下根据关键词杀死所有相关进程。ps -ef | grep code | grep -v grep | cut -c 10-16 | xargs kill -s 9 top和ps基本作用都是显示系统进程状况&…

matplotlib绘图一例

网上外卖用户规模及使用率import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd# 数据源自www.cnnic.net.cn。 l [["2015/12", "1.14亿", "16.5%"], ["2016/6", "1.50亿", "21.1%…

electron-builder 打包问题,下载慢解决方案

目录 问题说明设置下载源 &#xff1f;解决方案思路下载Electron下载winCodeSign下载nsis下载nsis-resources 总结 问题说明 项目使用了Electron&#xff0c;在第一次打包时会遇见下载慢&#xff0c;导致打包进度几乎停滞不前&#xff0c;甚至可能直接报错 其实这是因为Electr…

套的-流量分析

目录 1、流量分析2、寻找flag3、总结 1、流量分析 把流量包下载下来进行分析&#xff0c;得到下面这些信息 通过追踪HTTP流&#xff0c;我们可以很明显的感觉到是对42.193.4.49进行目录爆破 追踪流给出的信息是不完整的&#xff0c;我们只是用来推测大概的过程&#xff0c;了解…

在电脑桌面上怎么制作可视化工作计划待办清单?

对于忙碌的上班族来说&#xff0c;每天都需要处理大量的工作任务&#xff0c;如何在繁杂的工作中保持高效和有序&#xff0c;成为了一个亟待解决的问题。在电脑桌面上制作可视化的工作计划待办清单&#xff0c;就是一个非常实用的方法。通过将工作任务以清单的形式展现在桌面上…

头条网盘拉新怎么通过授权解锁推广权限

头条网盘拉新项目是去年12月份才首发上线的一个项目&#xff0c;从佣金上&#xff0c;只要拉新一个用户就可以获取价格为9元的佣金&#xff0c;且拉失活用户也可以获取价格为4元的佣金&#xff0c;从背景上&#xff0c;背靠字节跳动这个大公司&#xff0c;预算充足&#xff0c;…

2.Labview字符串与路径精讲(上) — 理论篇

本章讲解labview中的字符串和路径及其使用方法&#xff0c;从前面板字符串属性到后面板字符串函数应用做出详细概述&#xff0c;通过本文的学习希望大家了解到字符串在labview编程中的重要地位。 本系列文章为labview 从基础到强化到精通的学习文章&#xff0c;大家可以随时点进…

本地项目文件夹创建python文件并配置conda环境的完整流程

1 在Pycharm中创建新项目 位置就是本地的项目文件夹 2 接着打开pycharm的终端 创建conda环境&#xff08;这个过程需要保证conda.exe能够被系统路径识别&#xff09; conda create --name my_environment&#xff08;my_environment取自己想要的环境名字&#xff09; 还可以指…

MySQL - 单表访问

单表访问 查询方式 MySQL查询的执行方式大致分为下边两种&#xff1a; 使用全表扫描进行查询 这种执行方式很好理解&#xff0c;就是把表的每一行记录都扫一遍嘛&#xff0c;把符合搜索条件的记录加入到结果集就完了。不管是啥查询都可以使用这种方式执行&#xff0c;当然&am…