sizeof 和 strlen的对比及笔试题目

news2024/11/18 14:38:37

目录

题目1:

题目2:

题目3:

题目4:

题目5:

题目6:

二维数组题(重点):

上述题目总结:


若想了解其他的字符函数和字符串函数请移步:深入理解字符串函数和字符函数(一)-CSDN博客

sizeof 和 strlen主要区别如下:
1、sizeof是运算符,strlen是C语言标准库函数。
2、 strlen 测量的是字符串的实际长度,以’\0’ 结束,返回结果不包括’\0’ 。
3、而sizeof 测量的是字符的分配大小,它的参数可以是数组、指针、类型、对象、函数等。

题目1:

int main()
{
    char arr[20] = "abcdef";
    size_t len = strlen(arr);//6
    //统计的是从strlen函数的参数str中这个地址开始向后,\0之前字符串中字符的个数


    printf("len = %zd\n", len);
    size_t sz = sizeof(arr);//20
    printf("sz = %zd\n", sz);

  char arr[] = { 'a','b','c'};//42,随机的,编译器随机

      \0的位置不确定,终的数值也不确定

    printf("%zd\n", strlen(arr));


    

    char arr[6] = "abcdef";//err \0 有7个字符,越界

    return 0;

}

题目2:

int main()
{
    int a[] = { 1,2,3,4 };//a数组有四个元素,每个元素是int类型的数据

    printf("%d\n", sizeof(a));//16 - sizeof(数组名)的情况,计算整个数组的大小,单位是字节 - 4 * 4 = 16
    printf("%d\n", sizeof(a + 0));//4 or 8 取决于是32位还是64位
    //a表示的是数组首元素的地址,a+0还是首元素的地址

    printf("%d\n", sizeof(*a));//4  a表示的是数组首元素的地址,*a就是首元素,大小是4个字节
    printf("%d\n", sizeof(a + 1));//4 or 8

 

 //a + 1是第二个元素的地址

    printf("%d\n", sizeof(a[1]));//4  a[1]是数组的第二个元素,大小是4个字节
    printf("%d\n", sizeof(&a));//4 or 8  &a - 取出的是数组的地址,但是数组的地址也是地址,
    //int (*pa)[4] = &a
    //int (*)[4]
    
    printf("%d\n", sizeof(*&a));//16
    //1.抵消  &*  sizeof(*&a) == sizeof(a)
    //2.&a 的类型是数组指针,int(*)[4],*&a就是对数字指针解引用访问一个数组的大小,是16个字节

    printf("%d\n", sizeof(&a + 1));//4 or 8 &a+1是跳过整个数组后的地址,是地址,大小就是4/8个字符
    printf("%d\n", sizeof(&a[0])); //4 or 8 &a[0]是第一个元素的地址,大小就是4/8个字符
    printf("%d\n", sizeof(&a[0] + 1));//4 or 8
    //&a[0]+1是第二个元素的地址,大小就是4/8个字符

    return 0;
}

题目3:

int main()
{
    char arr[] = { 'a','b','c','d','e','f' };//arr数组中有6个元素

    printf("%d\n", sizeof(arr));//6 计算的是整个数组的大小
    printf("%d\n", sizeof(arr + 0));//4 or 8 arr+0是数组的第一个元素的地址
    printf("%d\n", sizeof(*arr));//1  *arr是首元素地址的解引用,就是1个字节
    printf("%d\n", sizeof(arr[1]));//1 - arr[1] = 'b' 
    printf("%d\n", sizeof(&arr));//4 or 8
    printf("%d\n", sizeof(&arr + 1));//4 or 8
    printf("%d\n", sizeof(&arr[0] + 1));//4 or 8

    return 0;
}

题目4:

int main()
{
    char arr[] = "abcdef";
    printf("%zd\n", sizeof(arr));
    //sizeof的返回值是size_t,是无符号型,应该用%zd接收

    printf("%zd\n", sizeof(arr + 0));//arr+0是数组首元素的地址,地址大小是4、8个字节
    printf("%zd\n", sizeof(*arr));//*arr是数组首元素,这里计算的是首元素的大小 1 
    printf("%zd\n", sizeof(arr[1]));//1
    printf("%zd\n", sizeof(&arr));//&arr - 是数组的地址,数组的地址也是地址 4/8
    printf("%zd\n", sizeof(&arr + 1));&arr+1,跳过整个数组,指向了数组的后边 4/8 
    printf("%zd\n", sizeof(&arr[0] + 1));//&arr[0]+1是第二个元素的地址 4/8

    return 0;

}

此时&arr+1跳过整个数组

题目5:

int main()
{
    char arr[] = "abcdef";

    printf("%zd\n", strlen(arr));//arr是数组首元素的地址 6
    printf("%zd\n", strlen(arr + 0));//arr + 0 是数组首元素的地址 6
    printf("%zd\n", strlen(*arr));//  传递的是'a' - 97 //err
    printf("%zd\n", strlen(arr[1]));// 'b' - 98 //err
    printf("%zd\n", strlen(&arr));//6 ,&arr虽然是数组的地址,但是也是指向数组arr的起始位置
    printf("%zd\n", strlen(&arr + 1));//随机值
    printf("%zd\n", strlen(&arr[0] + 1));//&arr[0] + 1是第二个元素的地址 - 5
    
    return 0;
}

这里如果要传参,则用char *p来接收&arr,接收后的类型为char (*)[7],但strlen所需要的形参类型为char *str,编译会警告,但仍然能传递

(补充:因为strlen函数要求传入一个指向字符的指针,而不是一个指向字符数组的指针。而char (*p)[7]是一个指向字符数组的指针,所以当它传入strlen函数时会出现警告。

题目6:

 int main()
{
    char* p = "abcdef";
    printf("%d\n", sizeof(p));//4/8 计算的指针变量的大小
    printf("%d\n", sizeof(p + 1));//p + 1是'b'的地址,是地址大小就是4/8个字节
    printf("%d\n", sizeof(*p));//*p就是'a',大小是1个字节
    printf("%d\n", sizeof(p[0]));//p[0]-->*(p+0) - *p//1个字节
    printf("%d\n", sizeof(&p));//&p也是地址,是指针变量p的地址大小是4/8字节
    printf("%d\n", sizeof(&p + 1));//&p+1是指向p指针变量后面的空间,也是地址 - 4/8
    printf("%d\n", sizeof(&p[0] + 1));//&p[0]+1是'b'的地址 - 4/8
    return 0;
}

int main()
{
    char* p = "abcdef";
    printf("%zd\n", strlen(p)); //6
    printf("%zd\n", strlen(p + 1));//5
    printf("%zd\n", strlen(*p));//'a'-97 err
    printf("%zd\n", strlen(p[0]));//p[0]--*(p+0)-->*p //err
    printf("%zd\n", strlen(&p));//随机值 不确定\0的位置
    printf("%zd\n", strlen(&p + 1));//同上
    printf("%zd\n", strlen(&p[0] + 1));//从b的地址往后数 - 5

    return 0;
}

二维数组题(重点):

int main()
{
    //二维数组也是数组,之前对数组名的理解也同样适用
    int a[3][4] = { 0 };
    printf("%zd\n", sizeof(a));

    //12*4 = 48个字节,数组名单独放在sizeof内部
    printf("%zd\n", sizeof(a[0][0]));//4
    printf("%zd\n", sizeof(a[0]));

    //a[0]是第一行这个一维数组的数组名,数组名单独放在了sizeof内部了
    //计算的是第一行的大小,单位是字节,16个字节

    printf("%zd\n", sizeof(a[0] + 1));

    //a[0]是第一行这个一维数组的数组名,这里表示首元素地址
    //也就是a[0][0]的地址,a[0]+1是a[0][1]的地址

    printf("%zd\n", sizeof(*(a[0] + 1)));//a[0][1] - 4个字节
    printf("%zd\n", sizeof(a + 1));

     //a是二维数组的数组名,但是没有&,也没有单独放在sizeof内部
    //所以这里的a是数组首元素的地址,应该是第一行的地址,a+1是第二行的地址
    //大小也是4/8个字节
    printf("%zd\n", sizeof(*(a + 1)));

    //*(a+1)==>a[1] - 第二行的数组名,单独放在sizeof内部,计算的是第二行的大小 - 16个字节
    printf("%zd\n", sizeof(&a[0] + 1));

     //&a[0]是第一行的地址,&a[0]+1就是第二行的地址 4/8


    printf("%zd\n", sizeof(*(&a[0] + 1)));

     //访问第二行,计算的是第二行的大小,16个字节
    //int(*p)[4] = &a[0]+1

    printf("%zd\n", sizeof(*a));

    //这里的a是第一行的地址,*a就是第一行,sizeof(*a)计算的是第一行的大小 - 16
    //*a -->*(a+0)-->a[0]
    printf("%zd\n", sizeof(a[3]));

    //这里不存在越界
    //sizeof内部的表达式不会真实计算的
    //计算的是第四行的大小 - 16

    return 0;
}

上述题目总结:

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

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

相关文章

Gin投票系统(2)

投票系统 数据库的建立 先分析需求,在sql中建立数据库,关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表” 成功后目前有四个表: vote,user,vote_opt,vote_opt_user 建立数据库,可以…

万字解析设计模式之迭代器模式、备忘录模式

一、迭代器模式 1.1概述 迭代器模式是一种行为型设计模式,它允许在没有暴露其底层表现形式的情况下遍历集合对象。迭代器模式提供一种通用的遍历机制,可以遍历任何类型的集合,包括数组、列表、树等。通过这种模式,可以实现一种通…

微信小程序 老年人心血管健康知识科普系统

本系统的功能有管理员:个人中心,用户管理,热点信息管理,疾病管理,疾病类型管理,治疗管理,治疗类型管理,护理管理,护理类型管理,科普管理,科普类型…

Microsoft Office Exce-筛选后的公式批量复制粘贴为值 并且不乱数据

Microsoft Office Exce-利用选择性粘贴将筛选后的公式结果批量转换为值 1、写好【客单价】公式,并下拉填充 (【SKU】、【销售额】、【销售量】这三列都是常量,非公式) 2、复制客单价公式到E列 3、筛选数据, 按 Delet…

成员内部类(内部类) - Java

成员内部类 说明:成员内部类是定义在外部类的成员位置,并且没有static修饰。 可以直接访问外部类的所有成员,包含私有的。【案例a】可以添加任意访问修饰符(public、protected、默认、private),因为它的地…

数组中的第 K 个最大元素(C++实现)

数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列(最大堆)来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素,留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…

某东大厂面试js手写题【手写代码附带注释,放心食用,博主亲测】

文章目录 前言js实现push方法js实现订阅发布手写防抖节流手写reduce方法深拷贝es5去重数组多维数组去重排序简单递归实现树形结构输出遍历后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端面试 🐱‍👓博主在前…

摄影网站的技术 SEO:提示和最佳实践

摄影就是要给人留下良好的第一印象。如果你想在竞争中领先,摄影师的SEO是您可以采用的最佳营销方法之一。 我们都曾有过这样的经历:你建立了一个漂亮的作品集网站来吸引更多的业务。网站上线并在社交媒体上推广后,您就可以坐等了。网站访问量…

线程池在Java中的应用实践

摘要:在实际业务场景中,线程池发挥着重要作用。本文将详细解答在高并发、任务执行时间短、并发不高、任务执行时间长以及并发高、业务执行时间长的业务场景下,如何使用线程池进行优化。 一、高并发、任务执行时间短的业务场景 在高并发、任务…

python服装电商系统vue购物商城django-pycharm毕业设计项目推荐

系统面向的使用群体为商家和消费者,商家和消费者所承担的功能各不相同,所对象的权限也各不相同。对于消费者和商家设计的功能如下: 对于消费者设计了五大功能模块: (1) 商品信息:用户可在商品…

【黑马甄选离线数仓day06_核销主题域开发】

1. 核销主题_DWD和DWM层 1.0 ODS层 操作数据存储层: Operate Data Store 核心理念: 几乎和源数据保持一致,粒度相同 注意事项: 同步方式(全量同步,全量覆盖,增量仅新增,增量新增和更新) 内部表 分区表(部分) 指定字符分隔符 orc zlib 第二天的时候已经完成了从mysql以及sq…

蓝蜂虚拟网络工具配置说明

虚拟网络工具配置说明 注意: 1、在使用虚拟网络工具前,需保证EG20网关可以连接到EMCP云平台,并且设备已经绑定在对应的账号下,同时固件版本为v1.6.6以上。如果不是,点击固件版本处的更新,如下图所示。 2…

GitHub----使用记录

一、上传文件到仓库 1、首先新建一个github仓库 然后先记住这一句指令 2、下载git工具 https://git-scm.com/downloads 下载工具安装不用运行 3、使用git工具上传文件并推送 找到你想上传的文件的位置,右击git Bush here git init :初始化这个仓…

【Python 训练营】N_11 模拟进度条

题目 格式化输出进度条,具体格式如下: 分析 需要格式化打印,进度条随时间显示进展,需要用time模块的sleep()函数。 答案 import time # 导入time模块 length 100 # 定义进度长度模块 for i in range(1,length1): # 遍历1&…

Corel产品注册机Corel Products KeyGen 2023 – XFORCE解决会声会影2023试用30天

CorelDRAW注册机2023支持全系列产品_Corel Products KeyGen 2023 X-FORCE v8 CorelDRAW注册机2023支持全系列产品_Corel Products KeyGen 2023 X-FORCE v8,Corel产品注册机(Corel Products KeyGen 2023 – XFORCE),支持Corel旗下所…

TDL CDL信道模型

文章目录 一 TDL二 CDL三 CDL TDL区别 TDL:(Tapped Delay Line,抽头延迟线) CDL:(Clustered Delay Line,集群延迟线) 一 TDL 定义:由一组不同衰落系数和不同时延的抽头组成。全频率范围为:0.5GHz~100GHz&am…

【刷题笔记】分糖果||数组||暴力通过||符合思维方式||多案例分析

分发糖果 文章目录 分发糖果1 题目描述2 题目分析2.1 寻找波峰波谷2.2 从波底往波峰攀爬!2.2 计算糖果 3 代码附录1 1 题目描述 https://leetcode.cn/problems/candy/ n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&…

怎么判断香港服务器的性能好不好?

随着互联网的不断发展,越来越多的人开始使用香港服务器来搭建自己的网站或者应用。但是,对于初次使用香港服务器的用户来说,往往会遇到一个问题:怎么判断香港服务器的性能好不好? 首先我们需要了解香港服务器的性能主要取决于哪些…

智能优化算法应用:基于蝙蝠算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蝙蝠算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蝙蝠算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝙蝠算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

iconfont 使用彩色图标

1、下载iconfont到本地 2、全局安装 iconfont-tools npm install -g iconfont-tools 3、在iconfont解压目录下执行命令、一直回车 iconfont-tools 4、文件拷贝 执行完上述命令后会生成iconfont-weapp目录,将iconfont-weapp目录下的iconfont-weapp- icon.css文件…