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

news2024/12/24 21:25:54

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

一、一维数组

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环境下运行的结果


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

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

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

相关文章

Linux 创建目录

语法:mkdir xxx Linux路径 在当前目录下创建文件夹 在/目录下创建文件夹 如果想要一次性创建多个层级的目录,如下图 会报错,因为上级目录test并不存在,所以无法创建test目录 可以通过-p选项,将一整个链条都创建完成…

【OpenSSL】VC编译OpenSSL

VC编译OpenSSL 编译工具准备编译OpenSSL建立Hello World工程创建VS工程 编译工具准备 安装好Visual Studio。安装Perl, 主要是用来生成nmake的。准备好汇编语言编译工具nasm,并添加到path路径。下载好Open SSL源代码。 编译OpenSSL 安装Perl,并加入到path路径,检验…

【JAVA-Day18】用大白话讲解 Java 中的内存机制

标题 用大白话讲解 Java 中的内存机制摘要引言一、Java 内存机制1.1 栈内存1.2 堆内存 二、Java 如何管理内存三、合理管理内存的必要性与其他方式相比优势劣势建议四、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《…

idea创建springboot项+集成阿里连接池druid

创建项目并集成流程 1:前提准备2:创建springboot项目流程3:集成阿里连接池步骤4:集成swagger方便测试5:书写增删改查进行测试6:项目gitee地址 1:前提准备 准备开发工具:idea java环…

UI自动化测试实践

一、设计背景 随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI 自动化测试程序。旨在提供接口,集…

Blazor前后端框架Known-V1.2.15

V1.2.15 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 Gitee: https://gitee.com/known/KnownGithub:https://github.com/known/Known 概述 基于C#和Blazo…

Linux下的系统编程——守护进程、线程(十二)

前言: 我们知道进程拥有一个PCB,在Linux中被称为task_struct,并且有一个进程地址空间,也有一个页表,通过页表指向物理内存,但是从今天开始,对进程的概念可能发生变化,这个我们后边来说&#xf…

【微信小程序】项目初始化

| var() CSS 函数可以插入一个自定义属性(有时也被称为“CSS 变量”)的值,用来代替非自定义 属性中值的任何部分。 1.初始化样式与颜色 view,text{box-sizing: border-box; } page{--themColor:#ad905c;--globalColor:#18191b;--focusColor…

通过Vcpkg直接安装Qt静态链接免编译的方式

Vcpkg支持自动编译Qt静态链接版,大约只需要30min左右,解决编译困扰和配置环境带来的各种影响。 一、查找Qt包 https://vcpkg.io/en/packages 输入qt5可找到qt5版本,如果需要安装最新的qt6,可直接输入qt,如下: 二、修…

操作系统存储器章节知识梳理

🔥🔥宏夏Coding网站,致力于为编程学习者、互联网求职者提供最需要的内容!网站内容包括求职秘籍,葵花宝典(学习笔记),资源推荐等内容。在线阅读:https://hongxiac.com&…

关于阻抗不连续的原因

1、连线中的分支结构 信号传输到分支结构处,表现出的是两条电路并联的效果,会导致阻抗的不连续问题。典型的就是菊花链结构。 2、参考平面的宽度 一般情况下参考平面都是很宽且连续的,但有的时候,参考平面会被反焊盘给掏空…

FPGA/数字IC(芯海科技2022)面试题 2(解析版)

以下仅为学习参考(非原创),如有疑惑欢迎评论区指出! 一、单选题(共20题,每题3分,共60分) 1. D触发器:Tsetup3ns,Thold1ns,Tck2q1ns, 该D触发器最大可运行时…

笔记1.5:计算机网络体系结构

从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体:表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合,协议是水平的。 任一层实体需要使用下层服务,遵循本层…

Linux 下的 10 个 PDF 软件

本文[1]是我们正在进行的有关 Linux 顶级工具系列的延续,在本系列中,我们将向您介绍最著名的 Linux 系统开源工具。 随着互联网上越来越多地使用可移植文档格式 (PDF) 文件来获取在线书籍和其他相关文档,拥有 PDF 查看器/阅读器对于桌面 Linu…

Wireshark分析HTTPS流量

1、设置环境变量 (在不抓包的时候要把这个环境变量删掉,日志太多可能) # 变量名称 SSLKEYLOGFILE # 变量值:日志文件存储的路径 D:\data\ssl\keylog.log2、 配置配置Wireshark软件文件路径 配置上之后一定要重启,不重启没效果。

Math_2023_09_17.java

package homework;import util.StringUtil;/*** 八位数: 2 _ _ _ _ _ _ 5* 每相邻三个数字和为11** author ZengWenFeng* email 117791303qq.com* mobile 13805029595* date 2023.09.17*/ public class Math_2023_09_17 { public static boolean isOk(String str, int sum){in…

Apache Hive概述,模拟实现Hive功能,Hive基础架构

1、Apache Hive 概述 1.1、分布式SQL计算 对数据进行统计分析,SQL是目前最为方便的编程工具。 大数据体系中充斥着非常多的统计分析场景 所以,使用SQL去处理数据,在大数据中也是有极大的需求的。 MapReduce支持程序开发(Java…

88 # express 应用和路由的分离

上一节实现了应用和创建应用的分离,这一节来实现应用和路由的分离 application.js const http require("http"); const Router require("./router");function Application() {this._router new Router(); }Application.prototype.get fun…

Learn Prompt-ChatGPT 精选案例:内容总结

ChatGPT 可以通过分析内容并生成一个浓缩版本来总结文本。这对节省时间和精力很有帮助,特别是在阅读长篇文章、研究论文或报告时。 通用总结​ 你所要做的就是把具体的文字复制并粘贴到提示中,并要求ChatGPT对所选文本进行简化总结。这里我们参考opena…

[尚硅谷React笔记]——第1章 React简介

目录: 第1章 React简介 React的基本使用:虚拟DOM的两种创建方式: 使用jsx创建虚拟DOM使用js创建虚拟DOM(一般不用)虚拟DOM与真实DOM:React JSX:JSX练习:模块与组件、模块化与组件化的理解 模块组件模块化组件化 第1章 React简介 中文官网: …