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

WebSocket代理避坑指南:Nginx中proxy_set_header的3个关键配置项

WebSocket代理实战&#xff1a;Nginx中proxy_set_header的3个黄金法则 当在线聊天室的用户突然集体掉线&#xff0c;或是实时协作文档频繁失去同步时&#xff0c;问题往往藏在那些容易被忽视的HTTP头信息里。WebSocket作为现代实时应用的血管&#xff0c;其代理配置的精细程度直…...

双摆控制系统:LQR、LQG、LQI控制器及龙伯格观测器文件清单

移动小车上双摆的LQR、LQG、LQI控制器和龙伯格观测器文件列表&#xff1a; LQG.m LQG_non_linear.m LQI.m LQR.m LQR_Non_linear.m Luenberger_observer.m Observer_non_linear.m 最近蹲在实验室的工位上啃移动小车双摆的控制代码&#xff0c;翻来覆去调了快两周&#xff0c;终…...

OpenClaw安全方案:nanobot本地模型的数据隐私保护实践

OpenClaw安全方案&#xff1a;nanobot本地模型的数据隐私保护实践 1. 为什么选择本地化部署 去年夏天&#xff0c;我接手了一个特殊项目——为一家小型会计师事务所设计自动化财务文档处理方案。最初考虑使用云端AI服务时&#xff0c;客户明确提出了数据隐私的硬性要求&#…...

ViGEmBus虚拟手柄驱动:如何让任何设备变身Xbox 360或PS4控制器

ViGEmBus虚拟手柄驱动&#xff1a;如何让任何设备变身Xbox 360或PS4控制器 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在Windows游戏生态中&#xff0c;…...

在Ubuntu 20.04上搞定OpenFace:一份保姆级安装与避坑指南(含CEN模型和虚拟显示配置)

在Ubuntu 20.04服务器上部署OpenFace的终极实践指南 当你第一次尝试在无图形界面的Ubuntu服务器上部署OpenFace时&#xff0c;是否遇到过那些令人抓狂的报错信息&#xff1f;从缺失的CEN模型到GTK显示问题&#xff0c;每一步都可能成为阻碍你前进的绊脚石。本文将带你穿越这些技…...

从0到1手把手教你搭建AI Agent,打造多智能体协同系统

本文完整展示如何从 0 到 1 手搓一个 AI Agent 的搭建过程。在具体动手实操的过程中&#xff0c;重点为大家展示从需求分析到如何搭建。需求分析中包含如何识别 AI 提效场景和、梳理提效场景流程。如何搭建中包含工作流创建、智能体创建、智能体发布。接下来&#xff0c;将结合…...

告别卡顿!GSYVideoPlayer的ExoPlayer内核配置全攻略(支持HLS/m3u8直播流)

GSYVideoPlayer的ExoPlayer内核深度调优&#xff1a;打造极致流畅的HLS直播体验 去年接手一个海外直播项目时&#xff0c;遇到最头疼的问题就是m3u8流媒体的卡顿和延迟。测试了各种方案后&#xff0c;最终通过GSYVideoPlayer的ExoPlayer内核解决了这个难题。今天就把这些实战经…...

基于三菱PLC与MCGS组态的农田智能灌溉系统说明(两万字)

基于三菱PLC农田灌溉 包含说明一万 和MCGS组态农田智能灌溉系统说明一万前阵子回豫东老家帮我叔打理那三亩秋月梨果园&#xff0c;那浇地给我整得怀疑人生——三伏天顶着三十七八度的太阳&#xff0c;扛着铁锹跑遍地头开电磁阀&#xff0c;中午热得头晕就算了&#xff0c;晚上还…...

实战指南:基于OpenSpec规范,使用快马平台生成可直接集成的微服务客户端代码

今天在微服务开发中遇到一个典型需求&#xff1a;我们的支付网关服务已经用OpenAPI 3.0规范定义好了接口&#xff0c;现在需要在另一个Java服务中调用这些接口。传统做法要手动写HTTP客户端代码&#xff0c;既耗时又容易出错。最近发现InsCode(快马)平台能基于OpenSpec文档自动…...

新手必看!用Simulink搭建ANPC三电平逆变器的SPWM仿真模型(附完整模型文件)

从零构建ANPC三电平逆变器的SPWM仿真模型&#xff1a;Simulink实战指南 在电力电子领域&#xff0c;多电平逆变器因其优异的输出波形质量和较低的开关损耗而备受关注。其中&#xff0c;有源中点箝位型&#xff08;ANPC&#xff09;三电平逆变器凭借其独特的拓扑结构和控制灵活性…...