当前位置: 首页 > news >正文

指针和数组笔试题讲解(2)

🐵本篇文章将会对上篇一维数组笔试题的剩余部分和二维数组的笔试题进行讲解

一、一维数组

1>试题部分(一)✏️

    char* p = "abcdef";printf("%zd\n", sizeof(p)); printf("%zd\n", sizeof(p + 1)); printf("%zd\n", sizeof(*p));printf("%zd\n", sizeof(p[0]));printf("%zd\n", sizeof(&p));printf("%zd\n", sizeof(&p + 1));printf("%zd\n", sizeof(&p[0] + 1));

2>讲解部分📗

 printf("%zd\n", sizeof(p));

【讲解】p是一个字符指针,字符指针在接收字符串时,是将字符串的首地址传给指针,在这里就是将'a'的地址传给p,sizeof(p)就是求'a'的地址,那答案就是4/8个字节


printf("%zd\n", sizeof(p + 1));

【讲解】p是字符'a'的地址,+1后跳过一个字节,指向下一个元素'b',此时p+1就是'b'的地址,答案为4/8个字节


printf("%zd\n", sizeof(*p));
printf("%zd\n", sizeof(p[0]));

【讲解】p为数组首元素'a'的地址,对其解引用后,就是'a',p[0]也是'a',字符'a'的大小为1个字节


 printf("%zd\n", sizeof(&p));

 printf("%zd\n", sizeof(&p + 1));

【讲解】当我们定义一个指针,系统就会为其开辟内存空间,那么这块内存空间的编号就是地址,地址的大小为4/8个字节


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

【讲解】&p[0]为'a'的地址,+1后为'b'的地址,所以大小为4/8个字节

3>打印结果📑

以下是在x64环境下运行的结果

1>试题部分(二)✏️

    char *p = "abcdef";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));

2>讲解部分📘

printf("%d\n", strlen(p));

【讲解】strlen函数用来计算字符串长度,它会从接收到的地址的位置依次向后读取直到遇到'\0'结束,这里将字符串的首地址:'a'的地址传给了strlen函数,因此它会从'a'的地址处依次向后读取,直到遇到'\0',所以其答案为6个字节


 printf("%d\n", strlen(p + 1));

【讲解】这里strlen从'b'的地址处依次向后读取,因此答案为5个字节


printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));

【讲解】strlen函数接收的是地址,而这里是将'a'的ASCII码值传给了strlen,但是strlen仍然会将其视为地址,那么在运行程序时就会报错


printf("%d\n", strlen(&p)); 
printf("%d\n", strlen(&p + 1));

【讲解】在从下图&p或者&p + 1的位置向后读取时,不知道什么时候会出现'\0',随意答案为随机值


 printf("%d\n", strlen(&p[0] + 1));

【讲解】&p[0]为'a'的地址,+1后为'b'的地址,从该地址依次向后读取,答案为5个字节

3>打印结果📑

以下是在x64环境下运行的结果(已将会报错的代码注释)

二、二维数组

1>试题部分✏️

    int a[3][4] = { 0 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a[0][0]));printf("%zd\n", sizeof(a[0]));printf("%zd\n", sizeof(a[0] + 1));printf("%zd\n", sizeof(*(a[0] + 1)));printf("%zd\n", sizeof(a + 1));printf("%zd\n", sizeof(*(a + 1)));printf("%zd\n", sizeof(&a[0] + 1));printf("%zd\n", sizeof(*(&a[0] + 1)));printf("%zd\n", sizeof(*a));printf("%zd\n", sizeof(a[3]));

2>讲解部分📙

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

【讲解】a是二维数组的数组名,数组名单独放在sizeof中,就是求整个数组的大小,所以答案为12*4 = 48个字节


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

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

【讲解】a[0]是第一行一维数组名,没有单独出现在sizeof里,所以就代表着一维数组首元素的地址,+1后就是第一行第二个元素的地址,解引用后就是第一行第二个元素,所以答案分别为4/8和4个字节


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

【讲解】a为二维数组的数组名,代表数组首元素的地址也就是第一行的地址,+1后跳过一行变为第二行的地址,对第二行解引用后,就是求第二行的大小;

另一种分析:*(a + 1)就是a[1],a[1]就是第二行的数组名,将第二行的数组名单独放在sizeof中就是求第二行的大小,所以答案分别为4/8和16个字节


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

【讲解】a[0是]第一行一维数组的数组名,取地址后,就是第一行的地址,+1后跳过一行也就是第二行的地址,对其解引用就是求第二行的大小,答案为4/816个字节


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

【讲解】a[0]是第一行的数组名,==> *(a + 0) ==>*a ;数组名单独放在sizeof中就是求第一行的大小,答案为16个字节


printf("%zd\n", sizeof(a[3]));

【讲解】首先并不会访问冲突,因为sizeof是根据类型判断大小的并不会真正去访问它,将他单独放在sizeof中和将a[0]单独放在sizeof中是一个效果,答案都是16个字节

3>打印结果📑

以下是在x64环境下运行的结果


🙉那么本次对一维数组和二维数组的笔试题全部讲解完毕,后续会对指针的笔试题进行讲解

相关文章:

指针和数组笔试题讲解(2)

🐵本篇文章将会对上篇一维数组笔试题的剩余部分和二维数组的笔试题进行讲解 一、一维数组 1>试题部分(一)✏️ char* p "abcdef";printf("%zd\n", sizeof(p)); printf("%zd\n", sizeof(p 1)); printf("%zd\n", sizeo…...

MapReduce YARN 的部署

1、部署说明 Hadoop HDFS分布式文件系统,我们会启动: NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助 同理,Hadoop YARN分布式资源调度,会启动:ResourceManager进程作为管理节点NodeM…...

vue 引入zTree

下载js包解压后找个地方放文件夹内 引入 import "/common/zTree/js/jquery-1.4.4.min" import "/common/zTree/js/jquery.ztree.core.min.js" import "/common/zTree/js/jquery.ztree.excheck.min.js" import "/common/zTree/css/metroSt…...

链队列的基本操作(带头结点,不带头结点)

结构体 typedef struct linknode{int data;struct linknode* next;后继指针 }linknode; typedef struct {linknode* front, * rear;//队头队尾指针 }linkquene; 初始化队列(带头结点) int initquene(linkquene* q)//初始化队列 {q->front q->r…...

深入学习 Redis Cluster - 基于 Docker、DockerCompose 搭建 Redis 集群,处理故障、扩容方案

目录 一、基于 Docker、DockerCompose 搭建 Redis 集群 1.1、前言 1.2、编写 shell 脚本 1.3、执行 shell 脚本,创建集群配置文件 1.4、编写 docker-compose.yml 文件 1.5、启动容器 1.6、构建集群 1.7、使用集群 1.8、如果集群中,有节点挂了&am…...

C现代方法(第3、4章)笔记

文章目录 C现代方法笔记(chapter3&4)第3章 格式化输入/输出3.1 printf函数3.1.1 转换说明3.1.2 转义序列 3.2 scanf函数3.2.1 scanf函数的工作方法3.2.2 格式串中的普通字符3.2.3 易混淆的printf函数和scanf函数 问与答编程题 第4章 表达式4.1 算术运…...

R语言绘制染色体变异位置分布图,RIdeogram包

变异位点染色体分布图 今天分享的内容是通过RIdeogram包绘制染色体位点分布图,并介绍一种展示差异位点的方法。 在遗传学研究中,通过测序等方式获得了基因组上某些位置的基因型信息。 如下表,第一列是变异位点的ID,第二列是染色体…...

Vue知识系列(7)每天10个小知识点

目录 系列文章目录Vue知识系列(1)每天10个小知识点Vue知识系列(2)每天10个小知识点Vue知识系列(3)每天10个小知识点Vue知识系列(4)每天10个小知识点Vue知识系列(5&#x…...

5分钟就能实现的API监控,有什么理由不做呢?

API深度影响着你的应用 今天的数字应用世界其实是一个以API为中心的世界,我们只是没有意识到这些API的重要性。比如在电子商务交易、社交媒体等对交互高度依赖的领域,可以说API决定了应用的质量一点也不为过。 以京东为例,用户的每一次操作背…...

Jmeter引入外部jar包以满足加密数据的Post请求

目录 一、把项目打成jar包 1、创建一个Maven项目,并保证可以正常运行。 2、把工具类放置项目中,确保无报错且能够正常使用。 3、打包 4、验证 jar包是否有效 5、你想打多个工具类的包 二、在jmeter中使用 1、把jar包放到jmeter仓库下,…...

了解冒泡排序

package com.mypackage.array;import java.util.Arrays;public class Demo07 {public static void main(String[] args) {int[] a {3,2,6,7,4,5,6,34,56,7};int[] sort1 sort1(a); //调用我们自己写的排序方法后,返回一个排序后的数组System.out.println(Array…...

群辉 Synology NAS Docker 安装 RustDesk-server 自建服务器只要一个容器

from https://blog.zhjh.top/archives/M8nBI5tjcxQe31DhiXqxy 简介 之前按照网上的教程,rustdesk-server 需要安装两个容器,最近想升级下版本,发现有一个新镜像 rustdesk-server-s6 可以只安装一个容器。 The S6-overlay acts as a supervi…...

为什么要有override

多态一定会成功吗 因为逻辑是用户编写的,那么肯定会有遗漏的地方,那就要规则来限制。就比如多态,都知道条件之一是子类重写了父类的虚函数,但是如果子类没有严格遵守这个规则,就无法达到目的。就比如这个代码&#xf…...

Linux界的老古董

Slackware 是由 Patrick Volkerding 制作的 Linux 发行版,从 1993 年发布至今也一直在 Patrick 带领下进行维护。7 月 17 日,Slackware 才刚刚过完它 24 岁的生日,看似年纪轻轻的它,已然是 Linux 最古老的发行版。 Slackware 的发…...

安卓逆向 - Xposed入门教程

一、引言 Xposed框架,是Android中Hook技术的一个著名的框架,拥有非常丰富的模块,给我们分析app提供了极大的便利,Xposed框架是开源的。最高支持到Android 8(重要) github地址:GitHub - rovo89…...

【嵌入式】2024届校招岗位汇总

公司岗位博世嵌入式自动化测试工程师博世嵌入式开发(软件刷写及启动)工程师博世Linux/C软件工程师博世自动驾驶软件开发工程师博世嵌入式软件工程师(BSP)博世嵌入式电子工程师 (BMS&电源)博世物联网嵌入式开发工程师 &#xf…...

Docker搭建ELK日志采集服务及Kibana可视化图表展示

架构 ES docker network create elkmkdir -p /opt/ELK/es/datachmod 777 /opt/ELK/esdocker run -d --name elasticsearch --net elk -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -v /opt/ELK/es/plugins:/usr/share/elasticsearch/plugins -v /opt/…...

SpringBoot结合MyBatis实现多数据源配置

SpringBoot结合MyBatis实现多数据源配置 一、前提条件 1.1、环境准备 SpringBoot框架实现多数据源操作,首先需要搭建Mybatis的运行环境。 由于是多数据源,也就是要有多个数据库,所以,我们创建两个测试数据库,分别是…...

单个vue echarts页面

<template> <div ref"history" class"echarts"></div> </template> <script> export default{ data () { return {}; }, methods: { history(){ let myChart this.$echarts.init(this.$refs.history); // 绘制图表 myCha…...

【web开发】6、Django(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Django是什么&#xff1f;二、使用步骤1.安装Django2.创建项目3.创建app4.快速上手5.模板继承 数据库操作1.安装第三方模块2.自己创建数据库3.DJango链接数据库…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...