C进阶 :征服指针之指针与数组强化笔试题练习(1)

news2024/11/24 9:27:32

目录

😼😸一.彻底明白 sizeof 操作符 ,数组名,strlen 函数

🐅1.数组名的意义

🐆2. sizeof 详解

🐋3.strlen详解

🦖3.数组名意义详细图解演示

 🐱🙀二.关于 sizeof 的指针和数组笔试题讲解

🐯T1.

🦁T2.

🐻‍❄️ T3.

🐲T4.

🐇 T5.


一.彻底明白 sizeof 操作符 ,数组名,strlen 函数

1.数组名的意义

1. sizeof ( 数组名 ),这里的数组名表示的是整个数组 ,计算的是整个数组的大小;

2.&数组名 ,取出的是整个数组的地址,虽然与数组首元素地址的值相同,但意义却完全不同;

3.除此之外的其他所有情况数组名都表示数组首元素的地址。


2. sizeof 详解

1. sizeof 计算的是操作数的类型长度,单位是字节;

2. sizeof 返回的是无符号整型;

3. sizeof 计算的是操作数的类属性,而不是值属性,即 sizeof 内部的表达式不进行计算;


3.strlen详解

1.描述:

2.参数:

 

3.返回值:

4.所以 strlen 函数计算的是一个字符串的长度,不可以把参数写成字符或是其他的,且 strlen 遇到 '\0' 就结束了。 


补充1:

表达式有两种属性:

1.值属性

2.类属性

补充2:

只要是地址, sizeof 计算时:

1. 32 位机器是4个字节;

2. 64 位机器是8个字节。


例:

 


3.数组名意义详细图解演示

 二.关于 sizeof 的指针和数组笔试题讲解

T1.

//一维数组
      int a[] = {1,2,3,4};
1.    printf("%d\n",sizeof(a));
2.    printf("%d\n",sizeof(a+0));
3.    printf("%d\n",sizeof(*a));
4.    printf("%d\n",sizeof(a+1));
5.    printf("%d\n",sizeof(a[1]));
6.    printf("%d\n",sizeof(&a));
7.    printf("%d\n",sizeof(*&a));
8.    printf("%d\n",sizeof(&a+1));
9.    printf("%d\n",sizeof(&a[0]));
10.   printf("%d\n",sizeof(&a[0]+1));

Q1:

sizeof 里只有单独一个数组名,所以 sizeof 计算的就是整个数组的大小,该数组有4个元素,每个元素的类型是 int ,所以整个数组的大小就是 16;

答案:16

Q2:

sizeof 里不是单独的数组名了,也不是&数组名,那么此时的数组名就表示数组首元素的地址,加上0,表示跳过0个字节,所以 a+0 表示的依然是首元素的地址,是地址那么如果是32位机器就是4,64位机器就是8;

答案:4/8

Q3:

 sizeof  内部不是单独的数组名,也不是&数组名,那么此时的数组名就表示数组首元素的地址,对其解引用,就是数组首元素 1 ,类型是 int 所以答案是4;

答案 :4

Q4:

与上同理,此时的数组名表示的依然是数组首元素的地址,+1 表示下标为1的元素的地址,所以不是4就是8;

答案:4/8

Q5:

a[ 1 ]表示下标为1的元素,该数组元素类型为 int ,所以答案是4;

答案:4

Q6:

sizeof 内部是&a,表示的是整个数组的地址,是地址那么答案不是4就是8;

答案:4/8

Q7:

&a 取出了整个数组的地址,对其解引用就找到了整个数组,就相当于 *  和  &  相互抵消了,就相当于sizeof 内部只有一个单独的数组名,那么答案就是16;

答案:16

Q8 ,Q9 , Q10:

很明显,这三题 sizeof 内部的表达式都表达的是一个地址,那么答案为4或8;

Q8, Q9, Q10答案:4/8

32位机器打印结果:

T2.

      //字符数组
      char arr[] = {'a','b','c','d','e','f'};
1.    printf("%d\n", sizeof(arr));
2.    printf("%d\n", sizeof(arr+0));
3.    printf("%d\n", sizeof(*arr));
4.    printf("%d\n", sizeof(arr[1]));
5.    printf("%d\n", sizeof(&arr));
6.    printf("%d\n", sizeof(&arr+1));
7.    printf("%d\n", sizeof(&arr[0]+1));

有了上题的基础,这题做起来就很简单了。

Q1:

sizeof 内部只有单独一个数组名,即此时计算的是整个数组的大小;

注意:数组里的元素不是字符串,所以只存了 6 个元素,并没有 \0 存在

答案:6

Q2:

可以看出,sizeof 内部表示的是一个地址

答案:4/8

Q3:

此时数组名是数组首元素的地址,解引用即为数组的首元素,类型为 char 

答案:1

Q4:

表示数组下标为1的元素,类型为 char 

答案:1

Q5:

&arr 是一个地址,这就不用多说了

答案:4/8

Q6:

同样是地址,不过这表示的是:

 答案:4/8

Q7:

仍然是一个地址,不过和上题的表示的意义不同:

答案:4/8

32位机器打印结果:

 T3.


      char arr[] = "abcdef";
1.    printf("%d\n", sizeof(arr));
2.    printf("%d\n", sizeof(arr+0));
3.    printf("%d\n", sizeof(*arr));
4.    printf("%d\n", sizeof(arr[1]));
5.    printf("%d\n", sizeof(&arr));
6.    printf("%d\n", sizeof(&arr+1));
7.    printf("%d\n", sizeof(&arr[0]+1));

注意:这个数组里存的是一个字符串,所以数组里的元素是这样的:

Q1:

只有单独一个数组名,所以计算的是整个数组的大小;

答案:7

Q2:

arr+0 表示数组首元素的地址;

答案:4/8

Q3:

*arr 表示数组首元素,类型为 char ;

答案:1

Q4:

arr[1] 表示数组下标为1的元素,类型为 char 

答案:1

Q5,Q6,Q7 :

都表示的是地址,所以:

答案:4/8

32位机器打印结果:

T4.



      char *p = "abcdef";
1.    printf("%d\n", sizeof(p));
2.    printf("%d\n", sizeof(p+1));
3.    printf("%d\n", sizeof(*p));
4.    printf("%d\n", sizeof(p[0]));
5.    printf("%d\n", sizeof(&p));
6.    printf("%d\n", sizeof(&p+1));
7.    printf("%d\n", sizeof(&p[0]+1));

这题是把常量字符串的首元素地址赋给了指针变量 p ,所以p也有一个地址 :

 Q1:

p 是字符串首元素的地址,是地址 那么计算结果为4或8;

答案:4/8

Q2:

仍为地址;

答案:4/8

Q3,Q4:

*p和怕 p[0]  表示 字符串首元素,类型为 char 

答案:1

补充:

 

Q5,Q6,Q7:

都表示的是地址,所以答案毋庸置疑,为4或是8;

&p :p 的地址;

&p+1 : 跳过 p 的地址的大小,以32位机器为例,跳过 4 个字节;

&p[0]+1:字符串中 元素 ’ b ' 的地址, 也可以写成 &p[1] ,二者相等;

 答案:4/8

32位机器打印结果:

 T5.


       //二维数组
       int a[3][4] = {0};
1.     printf("%d\n",sizeof(a));
2.     printf("%d\n",sizeof(a[0][0]));
3.     printf("%d\n",sizeof(a[0]));
4.     printf("%d\n",sizeof(a[0]+1));
5.     printf("%d\n",sizeof(*(a[0]+1)));
6.     printf("%d\n",sizeof(a+1));
7.     printf("%d\n",sizeof(*(a+1)));
8.     printf("%d\n",sizeof(&a[0]+1));
9.     printf("%d\n",sizeof(*(&a[0]+1)));
10.    printf("%d\n",sizeof(*a));
11.    printf("%d\n",sizeof(a[3]));

Q1:

单独的数组名在 sizeof 内部,计算整个数组的大小,该数组有12个元素,每个元素的类型是 int ,所以 4 x 12=48;

答案:48

Q2:

a[0][0] :即数组第一个元素,类型为 int ;

答案:4

Q3:

 由上图可知,在二维数组 arr[3][4] 中,arr[0],arr[1],arr[2],都可以看成是数组名,单独的数组名在sizeof 内部,计算的是整个数组的大小,arr[0] 数组由4个元素,每个元素类型为 int ,所以

4 x 4=16;

答案:16

Q4:

arr[0] 是第1行数组的首元素地址,+1,表示 arr[0][1] 的地址,所以计算结果为4或8;

答案:4/8

Q5

* (a[0]+1)  得到 a[0][1],元素类型为 int ;

答案:4

Q6:

数组名 a 即二维数组的首元素地址,二维数组首元素地址为第一行的地址,a+1 即二维数组第二行的地址,因为是地址,所以结果为4或8;

答案:4/8

Q7:

a+1=a[1]  ,*(a+1) 相当于对数组a[1]的地址解引用,即计算的是一维数组  a[1] 或是二维数组第二行的大小 ,所以是 16;

答案:16

Q8:

取出二维数组第1行的地址加1即第2行的地址,还是个地址;

答案:4/8

Q9:

对第2行的数组解引用,计算 一维数组 a[1] 的 整个大小;

答案:16

Q10:

此时数组名是数组首元素的地址,解引用找到第一行 的所有元素;

答案:16

Q11:

一眼看过去,a[3] 数组不是越界了吗,所以这是条错误的语句?

其实不是,这题是可以正常运行的,前面讲过,表达式有两种属性,一个是值属性,一个是类属性,而sizeof 计算的是表达式的类属性,所以它不会计算 a[3] ,只会计算 a[3] 类型所占的字节数,通过上文,我们很清楚,这个类型的字节数是 16;

答案:16

32位机器打印结果:

 

         🐼关于 sizeof 的题目讲到这里了,如有错误或是建议,欢迎小伙伴们提出,关于 strlen 函数的题目 将在下一篇文章中出现。🐰

       😽 如果想要了解更多的话,希望能三连支持支持博主啊,你们的支持对我很重要。😸😸

       🦖🦄 谢谢你的阅读。🐋🦝

        

 

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

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

相关文章

使用JDBC+javafx写一个简单功能齐全的图书管理系统

目录 1、JDBC的使用 2、对应包和Java文件的层级关系及对应的含义 3、数据库 4、相关代码 1)、bookmanager包 Ⅰ、main函数 Ⅱ、utils包 Ⅲ、bean包 Ⅳ、controller包 2)resources(为资源文件包,可以看链接文章了解) Ⅰ、book包 Ⅱ、 login包…

嘘!P站数据分析年报;各省市疫情感染进度条;爱奇艺推出元宇宙App;You推出AI聊天机器人;GitHub今日热榜 | ShowMeAI资讯日报

👀日报合辑 | 🎡AI应用与工具大全 | 🔔公众号资料下载 | 🍩韩信子 📢 『The 2022 Year in Review』P站2022年度报告 Pornhub 发布了第 9 次年度报告,数据科学家们绘制了多张彩色可视化图表,回顾…

Spring注册Bean系列--方法3:@Import+@Bean

原文网址:Spring注册Bean系列--方法3:ImportBean_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法:ImportBean。 注册Bean的方法我写了一个系列,见:Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…

Redis-SDS

本文你能得到: 1 SDS基本介绍 。 2 SDS与 C语言传统字符串的区别,为什么使用SDS。 3 SDS的结构和策略详解。 1 SDS 是什么?用来做什么? 1.1 ​ Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组&a…

[网络工程师]-STP

生成树协议(Spanning Tree Protocol,STP)是一种链路管理协议,为网络提供路径冗余,同时防止产生环路。交换机之间使用网桥协议数据单元(Bridge Protocol Data Unit,BPDU)来交换STP信息…

C语言中单井号(#)和双井号(##)在宏语句中的应用

在阅读Linux内核代码过程中,特别是一些预处理指令宏的时候,会看到宏语句里会包含一些# 或者是连着的## 符号,刚接触的时候觉得很一头雾水,但这些宏语句有时候绕不开,所以为了更好地读懂这些代码,很有必要仔…

头豹研究院发布《2022年腾讯安全威胁情报能力中心分析报告》:助力企业掌握安全防御主动权

12月23日,头豹研究院发布了《2022年腾讯安全威胁情报能力中心分析报告》(以下简称《报告》),深度研究了腾讯安全威胁情报能力建设、威胁情报能力应用、威胁情报价值实践方面的现状及成果,从专业视角分析腾讯安全威胁情…

全网首发!华为云UCS正式商用

日前,华为云UCS正式商用。华为云UCS是业界首个分布式云原生服务,支持对华为云集群、伙伴云集群、多云集群、本地集群和附着集群的统一管理,覆盖中心Region、专有Region、边缘云、客户数据中心和第三方云场景,提供无处不在的云原生…

深度学习02:损失函数总结

目录 nn.L1Loss: nn.NLLLoss: nn.MSELoss: nn.CrossEntropyLoss: 损失函数是用来估量模型的预测值与真实值的不一致程度,它是一个非负实值函数。我们训练模型的过程,就是通过不断的迭代计算,使用梯度下降的优化算法,使得损失函…

Day 05- Vue3 Vue2响应式原理

Vue2的响应式 核心:通过 Object.defineProtytype() 对对象的已有属性值的读取和修改进行劫持; 数据劫持 --> 给对象扩展属性 --> 属性设置 实现原理: 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截…

风控黑名单库的使用与判断指南

反欺诈策略中有一类策略是专门针对黑名单用户的,我们称之为黑名单命中策略。 一、黑名单定义 黑名单是对严重逾期、骗贷、失联、诈骗等系列高风险客群构建的名单,即为明确非意向客群的名单。黑名单也是反欺诈的第一道防线,可以有效识别黑产客…

近些年大火的零信任,落地情况怎么样?

疫情以来      居家办公、远程工作需求激增      企业IT环境变得更加复杂      在此背景下      以“持续验证,永不信任”为核心的      零信任火爆出圈      引得国内外企业机构纷纷布局      然而根据戴尔2022全球数据保护指数(GDPI),尽管91%的组…

使用FFmpeg+go搭建m3u8点播服务器

一. 前言 HLS(HTTP Live Streaming) 是苹果公司提出的基于 HTTP 的流媒体传输协议,它的工作原理是将整个文件切分成一个个小的文件(通常是 TS 格式文件),客户端通过 HTTP 下载播放。在准备播放某个 m3u8 媒…

Linux系统运行时参数命令--Linux基础命令和工具

目录 1 Linux基础命令和工具 1.1 grep搜索字符 1.2 find查找文件 1.3 ls显示文件 1.4 wc命令 1.5 ulimit用户资源 1.6 scp远程拷贝 1.7 dos2unix和unix2dos 1.8 sed 行处理 简单模式 替换模式 1.9 awk 列处理 C/CLinux服务器开发/后台架构师【零声教育】-学习视频…

车载软件架构—CP和AP相同与不同

文章目录 前言一、两者不同之处二、两者架构设计原则总结前言 AUTOSAR(AUTmotive Open System ARchitecture) 是汽车电子E/E系统发展的一个重要的节点。该标准是由包括BMW、DAIMLER、GM、TOYOTA、福特等主机厂和包括博世、大陆等供应商牵头成立的一个标准发展组织定义的一个开…

45页智慧交通数字化解决方案2022

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除! 完整资料领取见文末,部分资料内容: 项目建设目标…

RabbitMQ简单模式

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉Linux专栏 🔥欢迎大佬指正,一起学习!一起加油! 目录&…

20 个常用的 pandas 使用技巧

大家好,我是小寒。 今天来分享 20 个常用的 pandas 使用技巧。如果觉得不错,点赞、转发安排起来。 1、以 Markdown 格式输出 DataFrame import pandas as pddf pd.DataFrame({a: [1, 2, 3, 4],b: [5, 6, 7, 8]})# You can control the printing of th…

ATAC-seq分析:教程简介(1)

简介 本课程[1]介绍 Bioconductor 中的 ATACseq 分析。 该课程由 2 个部分组成。这将引导您完成正常 ATACseq 分析工作流程的每个步骤。它涵盖比对、QC、peak calling、基因组富集测试、基序富集和差异可及性测试。 环境准备 IGV IGV 可以从 BROAD 网站安装。 》 https://www.b…

mysql实现行转列作为临时表、以及字符分割行转列

1.需求:实现两个日期段转换为具体的日期天数(2022-10-23至2022-10-26得到一张2022-10-23、2022-10-24、2022-10-25、2022-10-26的临时表) SELECTDATE_FORMAT( DATE_ADD( 2022-10-23 22:00:00, INTERVAL ( help_topic_id ) DAY ), %Y-%m-%d …