未来笔试重点(1)

news2024/9/30 5:35:09

一起成为更优秀的人在这里插入图片描述

在这里插入图片描述

1.数组笔试重点考察

1.1整型数组与sizeof

1.2字符数组与sizeof

1.3sizeof与字符串

1.4strlen与字符串

2.指针笔试重点考察

2.1指针与sizeof

2.2指针与strlen

sizeof与整型数组

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(数组名) – 数组名放在sizeof里面,数组名表示的是整个数组
2.&数组名 – 数组名表示的是整个数组:

1)
sizeof数组名-计算的是数组的总大小,单位字节:44=16
2)
由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+0还是首元素地址
是地址,大小就是4/8个字节 (看平台)
3)
由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a找到了首元素
是一个int类型的整数,是4字节
4)
由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+1表示第二个元素的地址,是地址就是4/8个字节
5)
a[1] == (a+1) ,由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,
a+1表示第二个元素地址,
解引用操作,找到第二个元素,所以是4个字节
6)
&a,a表示整个数组,&a取到了数组的地址,是地址,就是4/8个字节
7)
&a ,&a取到了数组的地址,再
解引用操作,找到了这个数组,相当于*&抵消了,所以
就是 a,单独放在sizeof内部,表示整个数组,大小是16字节
8)
&a+1,&a表示数组的地址,+1还是地址,只是跳过了一个数组,是地址,就是4/8个字节
9)
&a[0] == &*(a+0), &可以抵消,所以等于 (a+0)+1,由于a没有单独放在sizeof内部,也没有&a,所以a表示数组首元素地址,a+0+1就是第二个元素地址,是地址,就是4/8个字节
10)
&a[0] +1 == &
(a+0) +1,前面说过,&*可以抵消 就等于 (a+0)+1,a没有单独放在sizeof内部,所以a表示数组首元素地址,再+1,表示第二个元素地址,是地址,就是4/8个字节

我的环境是32位平台下:

在这里插入图片描述

sizeof与字符数组

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));

1)
arr单独放在sizeof内部,计算数组大小,6*1=6字节
2)
arr不再单独放在sizeof内部,arr表示数组首元素地址
+0还是地址,是地址,就是4/8字节
3)
arr表示首元素地址,*arr找到了首元素
即 字符a,大小是1字节
4)
arr[1] == (arr+1) ,首元素地址+1再解引用,
找到了第二个元素,大小是1字节
5)
&arr,arr表示整个数组,&arr取到了数组的地址,是地址,就是4/8个字节
6)
&arr+1,还是地址,只不过+1跳过了一个数组,是地址,就是4/8字节
7)
&arr[0]+1 == &
(arr+0) +1,&*可以抵消,就等于arr+0+1,arr表示数组首元素地址,+1是第二个元素地址,是地址,就4/8个字节

结果如下:

在这里插入图片描述

sizeof与字符串

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));

这是一个数组,放了一串字符串,后面有\0
1)
arr单独放在sizeof内部,表示数组整个数组,由于存在一个\0
大小是7个字节
2)
arr不再单独放在sizeof内部,arr表示数组首元素地址,是地址就是4/8字节
3)
此时arr表示数组首元素地址,*arr,找到了首元素,大小是1字节
4)
arr[1] == *(arr+1),arr表示首元素地址,+1是第二个元素地址,操作后,找到了第二个元素,大小1字节
5)
&arr,arr表示整个数组,&arr取到了数组的地址,是地址就是4/8字节
6)
,+1后还是地址,只是跳过了一个数组,是地址就是4/8字节
7)
&arr[0]+1,==&
(arr+0)+1,&*抵消了,==arr+0+1,表示第二个元素的地址,是地址就是4/8字节

在这里插入图片描述

strlen与字符串

char arr[] = "abcdef";
	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));

首先清楚strlen函数的参数是 const char* arr,传递的是一个地址
strlen会顺着这个地址往下找,直到找到 \0 为止,返回的是字符串的长度

1)
arr不并不是再sizeof内部,也不是&arr,所以arr表示数组首元素地址,即 "abcdef"中 a 的地址,strlen会顺着地址往下找,找到\0为止,并且不算\0,即返回6

2)
arr+0等价于arr,返回6
3)
arr表示首元素地址,*arr找到了首元素,即字符a,
'a’对应的ascii码值是97,意味着将97作为strlen 的地址,strlen会顺着97找下去,这是一个
错误的代码,所以程序会崩溃
在这里插入图片描述
如上图:
4)
与 3)相同,找到字符b,程序会崩溃
5)
这里会有一个警告:原因:arr是数组,数组的地址应该用数组指针来接收: char(p)[7] = &arr;
但是strlen的参数是:strlen(const char
arr);
参数不同,故报错,但不影响strlen的计算结果,为6
6)
&arr取到字符串的地址,+1跳过了一个字符串,
在这里插入图片描述
至于后面是什么,我们不得而知,也不知道strlen何时读取到\0,所以这里输出随机值

7)
&arr[0]+1 == &*(arr+0) +1,&*抵消了,==arr+0+1,
即找到了第二个元素的地址,也就是字符b的地址,从b开始往后数,答案就是5

结果如下:
在这里插入图片描述

指针和sizeof

	char* p = "abcdef";
	p是一个指针,指针存放的是地址,放不了一个字符串长度,只能存放a的地址
	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));

1)
p是一个指针,存放的是a的地址,是地址就是4/8字节

2)
p+1就是指向了第二个字符的地址,即b的地址,4/8
3)
p放的是a的地址,p找到了a,即p==a,就是1字节
4)
p[0] == (p+0) ,1字节
5)
&p,取到的是p的地址(不是字符串abcdef的地址)
是地址,就是4/8字节
6)
&p+1,跳过了一个指针p,还是地址,就是4/8字节
7)
&p[0]+1,等价于&
(p+0)+1,&*抵消了,等价于p+0+1,即b的地址,是地址,就是4/8字节

结果如下:
在这里插入图片描述

指针和strlen

char* p = "abcdef";
	printf("%d\n", strlen(p));
	printf("%d\n", strlen(p+1));//5
	
	printf("%d\n", strlen(*p));//error
	printf("%d\n", strlen(p[0]));//err
	
	printf("%d\n", strlen(&p));
	printf("%d\n", strlen(&p+1));//随机值
	
	printf("%d\n", strlen(&p[0] + 1));

1)
p是char指针,存放的是a的地址,将该地址传递给strlen,strlen会顺着a的地址往后找,直到找到\0为止,所以长度是6字节
2)
p+1找到b的地址,strlen从该地址处往后找,结果是5
3)
p指向a的地址,p找到了a,把a作为strlen的地址,a的ascii码值是97,即将97作为strlen 的地址,是错误的
4)
p[0]==
(p+0),一样是错误的
5)
,&p,取到的是p的地址,注意是p的地址,不是a的地址,p的地址无法确定,所以是一个随机值
6)
同5),&p+1只是向前移动了1,但地址仍然是未知的
7)
&p[0]+1 == &
(p+0) +1,&*可以抵消,== p+0+1,即找到了b的地址,所以答案是5

结果如下:
在这里插入图片描述

关注我,持续为你输出高质量博文
在这里插入图片描述

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

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

相关文章

NMS与Soft NMS算法解析以及numpy实现

1. NMS算法 1.1 什么是NMS算法 NMS全称为Non Maximum Suppression,中文意思是非极大值抑制,字面意思就是不是极大值的元素被抑制掉,其实就是筛选出局部最大值得到最优解。NMS算法被广泛运用于目标检测算法处理网络输出的边界框。 1.2 为什…

浅谈Linux内核页面换入换出

【推荐阅读】 浅谈linux 内核网络 sk_buff 之克隆与复制 深入linux内核架构--进程&线程 了解Docker 依赖的linux内核技术 怎么在Windows下使用Makefile文件 浅析linux内核网络协议栈--linux bridge 0x00内存页面分类与换入换出规则 内存页面分为用户页面和内核页面。…

GDT践行(第一期):起床---运动--阅读

这里记录每周GDT践行记录.【2022】年第【51】周的第【6】天 封面图 第三部分:起床---运动--阅读 ❝ 小贴士: 在学校,出租房,宾馆,工位很多因素导致 学习区,运动区 卧室 都是同一个地方 环境导致你彻底彻底糊…

[附源码]Python计算机毕业设计Django课程在线测评系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

JVM部分知识点

目录 JVM主要组成部分及其作用? JAVA程序运行机制详情 JVM运行时的数据区 堆和栈的区别? Java垃圾回收机制 Java中有哪些引用类型? 如何判断对象是否可以被回收? JVM中的永久代会发生垃圾回收吗? JVM有哪些垃圾…

我国航空煤油行业发展趋势:燃油附加费复收 或将缓解企业经营压力

根据观研报告网发布的《中国航空煤油市场现状深度研究与投资前景分析报告(2022-2029年)》显示,航空煤油是石油产品之一,别名无臭煤油,主要由不同馏分的烃类化合物组成。航空煤油密度适宜,热值高&#xff0c…

【C语言】浮点型的存储方式

目录 一、浮点型和整型存储方式一样吗? 二、浮点型的存储规则 2.1 S,M,E求法 2.2 如何存放S,M,E 2.2.1 IEEE 754规定 2.2.2 特别的规定 2.2.3 验证 2.3 取出规则 2.3…

改造冰蝎马,实现免杀之default_aes php

本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记 文章目录 文章目录文章目录前文链接前言效果目标密码验证功能免杀后话前文链接 WAMP/DVWA/sqli-labs 搭建burpsuite工具抓包及Intruder暴力破解的使用目录扫描,请求重发,漏…

[附源码]Python计算机毕业设计黑格伯爵国际英语贵族学校官网Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

5G无线技术基础自学系列 | 单站点验证概述

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 单站点验证是指在基站硬件安装调试完成…

RNA-seq 详细教程:可视化(12)

学习内容 了解如何为可视化准备数据了解如果利用可视化来探索分析结果火山图可视化热图可视化可视化结果 当我们处理大量数据时,以图形方式显示该信息以获得更多信息,可能很有用。在本课中,我们将让您开始使用探索差异基因表达数据时常用的一…

【数电实验】移位寄存器与计数器

实验四 移位寄存器与计数器 一 实验目的 1 掌握任意进制计数器的构成方法; 2 熟悉双向移位寄存器的使用方法。 二 实验内容 1 任意进制计数器的构成方法: 用中规模集成计数器74HC161和与非门74LS00,构成十进制计数器。要求分别使用同步预…

精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景

什么是事务消息 事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。 事务消息所对应的场景 在一些对…

docker学习笔记(五)单个服务镜像部署

引言 当前微服务项目已经大面积普及,对于新需求迭代上线有许多疑惑的部分,比如线上的某些功能不能重启,在这种情况下我们需要部署和启动项目就不能搞大范围重启或干脆重新制作镜像,这种方式都是不可取的,这时候就需要…

重学webpack系列(二) -- webpack解决的问题与实现模块化的具体实践

只是根据几个想法,我们便创造出了webpack打包工具,它能够根据我们在前端项目中遇到的疑难杂症对症下药,那么这一章我们就一起来探讨一下我们项目落地所遇到的种种问题。 前端实践中的问题 Jsx / Tsx编译问题Less / Scss编译问题TypeScript编…

【Pintos】实现自定义 UserProg 系统调用 | 添加 syscall-nr 系统调用号 | 编写新的参数调用宏

💭 写在前面:本文讲解的内容不属于 Pintos 的 Project 项目,而是关于 userprog 如何添加系统调用的,学习如何额外实现一些功能到系统调用中以供用户使用。因为涉及到 src/example 下的Makefile 的修改、lib 目录下 syscall-nr 系统…

门诊排队叫号系统,有序叫号就诊,适用医院医院、门诊部、诊所等

排队叫号系统,是将互联网信息技术与门诊预约、签到、提醒、叫号、接诊等环节相结合,实现门诊流程式便捷叫号服务。 为助力门诊营造一个良好有序的就诊环境,打造科学合理的就诊流程,今天给大家推荐一款一款便捷排队叫号系统&#x…

Linux基本权限(2)

Linux基本权限(2) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要讲解了目录权限,和目录&#…

2022年底,我手里一共负责了30套系统

2022年真是不平凡的一年,往常熙熙攘攘的办公室人越来越少,真是像曹操说的兄弟相继凋零,好似风中落叶啊。 结果人少了,手里的系统一个没少,慢慢年底了,我汇总了一下,手里的系统达到了30来个。 搞…

Linux--基础IO

目录 C文件IO 系统文件IO 接口介绍 系统调用和库函数 文件描述符 open返回值 文件描述符的分配规则 重定向 代码演示 使用dup2系统调用 缓冲区 FILE 理解文件系统 文件系统 inode 软硬链接 静态库和动态库 概念 生成静态库 生成动态库 C文件IO 写文件 #in…