当前位置: 首页 > 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链接数据库…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...