指针和数组简单填空题合集(纯刷题:60道)

前言

本篇文章适合初学指针和数组的朋友,如果您看了前几组题觉得很简单,可以看一看我的另一篇文章。

通过本篇文章,你可以清晰的区分出strlen和sizeof的区别,(题目类型包括一维数组、二维数组)并提高自己做这类题熟练度,题目有点多,建议分成两到三次做,下面让我们开始吧。

小建议:先自己做再对答案,不明白可以看解析,如果你赶时间可以看我注释掉的题目,那些是我认为比较容易出错的

一维数组

题目1组

int main()
{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)); return 0;
}

答案

16
4/8
4
4/8
4
4/8
16
4/8
4/8
4/8

解析

说明:题号表示对应的题目

1.计算数组总大小,单位是字节,四个int类型的元素,加在一起就是16个字节

2.a+0此时已经不是数组名了,所以大小是4 补充说明: 只有当&数组名和sizeof(数组名)中的数组名才表示整个数组3.a是首元素地址,*a就是首元素,*a = 1,整型,大小是44.a+1类似于a+05.a[1] 是第二个元素6.&a取出数组地址,但数组地址也是一个地址,而地址的大小在32位平台上就是4个字节7.*&a,取出数组的地址再解引用,等于没有变化。一个数组的地址解引用等于访问一个数组8.&a取出数组的地址,+1跳过了整个数组,但它本质上还是一个地址,所以大小是49.第一个元素的地址,地址大小是4/810.第二个元素的地址,地址大小是4/8

题目2组

#include <string.h>int main()
{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)); return 0;
}

答案:

6
4/8
1
1
4/8
4/8
4/8

解析

1.计算的是数组大小,单位是字节

2.此处的arr是首元素地址,大小是4/8

3.解引用之后,是字符a,大小是1

4.第二个元素

5.&arr 是数组的地址,大小是4/8

6.&arr+1跳过一个数组,仍是一个地址,大小是4/8

7.计算完是第二个元素的地址,大小是4/8个字节

题目3组

#include <string.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };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)); return 0;
}

答案

随机值
随机值
错误❌
错误❌
随机值
随机值
随机值

解析

1.strlen遇到\0停止读取,arr中无\0,所以输出的是随机值

2.arr+0还是arr,结果仍然是随机值

3.

*arr是第一个元素,字符a,而字符a的ascii码值是97,相当于将97传给strlen,但strlen要求传入的是地址,所以他就认为97是地址,strlen函数就访问97这个地址,我们并不知道在地址97处存储的究竟是什么,所以我们也不知道输出结果是什么。在运行的时候程序会直接崩溃(一般是非法访问)(此处不做过多解释,如果看不懂,可以私信我(但这是作者能解释得最清楚的程度了))

4.arr[1]是第二个元素,字符b,类似于上一题,同样是错误的

5.此处传入的是数组arr的地址,那么传入之后,strlen同样从‘a’开始读取,arr末尾没有\0,所以输出随机值

6.从’f’后开始读取,遇到随机的\0之后停止读取
提示:这题的结果与上一题一起运行时,上面的结果比下面的大6

7.从字符b开始读取,数组末尾没有\0,结果是随机值

题目4组

int main()
{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)); return 0;
}

答案

7
4/8
1
1
4/8
4/8
4/8

解析

1.数组在初始化时包含\0,所以大小是7

2.arr+0,是首元素地址,大小是4/8

3.*arr,指向第一个元素,是字符类型,大小是1

4.第二个元素,字符类型,大小是1

5.&arr,是数组的地址,是地址,大小是4/8

6.&arr+1,仍然是地址,大小是4/8

7.指向第二个元素,是地址,大小是4/8

题目5组

int main()
{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)); return 0;
}

答案

6
6
错误
错误
6
随机值
5

解析

1.strlen遇到\0停止读取,\0不算在内,\0之前有6个元素,所以输出结果是6

2.arr+0,是首元素的地址,数组中有\0,所以结果是6

3.*arr是第一个元素,字符a,类似于上一组题中的第三题,都是传参类型出错,导致非法访问内存

4.传的是第二个元素,同样是非法访问

5.

从第一个地址开始访问,到\0停止访问,\0之前共有六个元素.
提示:数组的地址应存入数组指针型变量里,写成char(*p) = &arr;

而strlen的参数是const char*
此处会报警告,但是也可以强制运行

6.&arr+1,跳过arr数组,也跳过了数组里面的\0,所以结果是随机值

7.&arr[0] + 1,取出第一个元素的地址再加一,此时指向数组里的第二个元素,
从第二个元素到\0之前有5个元素,所以输出结果是5

题目6组

int main()
{const char* p = "abcdef"; 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)); return 0;
}

答案

4/8
4/8
1
1
4/8
4/8
4/8

解析

//先做一个简单的解释说明,p中存储的是第一个字符的地址

1.p是指针变量,p中存储的是地址,大小是4/8

2.p+1,得到的是第二个元素的地址,仍然是地址,所以大小是4/8

3.对p进行解引用,就是第一个字符,字符a,是字符类型,大小是1

4.

p[0],指的就是第一个元素,字符a,大小是1
补充说明:之前有讲过:数组名arr指的就是首元素的地址,那么就有下面这个等式:arr[0] == *(arr+0),

而p同样是首元素的地址,所以此处就相当于p[0] == *(p+0),即第一个元素

5.取出p的地址,是地址,地址大小是4/8

6.取出数组的地址,再加一,跳过整个数组,得到一个地址,是地址,地址大小是4/8

7.

看起来比较复杂,拆开来看,p[0]就是p,存的是第一个元素的地址,&p[0],就是取出第一个元素的地址,再加一,得到第二个元素的地址,是地址,地址大小是4/8

题目7组

int main()
{const 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)); return 0;
}

答案

6
5
错误
错误
随机值
随机值
5

解析

1.传入p,p中存储的是第一个元素的地址,传入strlen函数,输出元素个数:6

2.p+1,相当于&p[1],是第二个元素的地址,输出结果为5

3.*p传入的是a,直接报错

4.p[0]就是*p,程序报错

5.p中存储的是a的地址,取出指针变量p的地址,从变量p的地址处向后读取,而不是在字符串内读取,所以结果是随机值

6.同样是随机值

7.相当于p[1],是第二个元素的地址,结果是5

二维数组

题目

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

答案

48
4
16
4
4
4/8
16
4/8
16
16
16

解析

//简单解释:三行四列的二维数组
1.数组里有12个元素,大小是48个字节

2.第一个元素,是int类型,大小是4

3.指的是第一行元素,四个元素,大小是16
补充说明:可以认为该二维数组有三个元素,一行是一个元素,那么a[0]相当于第一行元素的数组名,也就是第一行的元素

4.上面提到a[0]是第一行元素的数组名,那么+1,指向的就是第一行的第二个元素,是int类型,大小是4个字节
补充说明:只有当数组名单独的放在sizeof内部时,数组名才是整个数组

5.对于第一行第二个元素的地址进行解引用,结果就是第二个元素,是int类型,大小是4

6.

a+1是地址,是指向第二行元素的地址,大小是4/8
解释说明:二维数组的数组名是首元素的地址,即第一行元素的地址,那么与整数运算时,单位是第一行元素的大小,所以指向的是第二行元素

7.第二行的地址解引用,是第二行元素,是四个int型,大小是16

8.

第二行的地址,是地址,地址大小是4/8
解释说明:a[0]就相当于第一行的数组名,数组名取地址,取出第一行的地址,再加一,得到第二行的地址

9.第二行的地址进行解引用,得到第二行四个int型的数据,大小是16

10.a是数组首元素地址,即第一行地址,解引用后得到第一行四个int类型的数据,大小是16

11.

a[3],类似于a[0],放入的是具有四个int类型的一维数组,大小是16
补充说明:sizeof中的表达式不参与真实运算,所以他并不会去访问第四行,这道题只是将a[3]放入其中,这类似于放入a[0]

小提示

做这类题,首先要明确数组名在这里究竟代表什么,是首元素地址?还是数组地址,之后再去运算就会方便一些

结语

刷题到这里就结束了,下一篇文章我会整理一些指针的面试题,来帮助大家更好的理解指针。
我们下篇文章见~

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

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

相关文章

Linux NTP原理及配置使用

一、NTP简介 1.NTP简介 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC&#xff0c;其精度在局域网内可达0.1ms&#xff0c;在互联网上绝大多数的…

CSS自学框架之动画

这一节&#xff0c;自学CSS动画。主要学习了淡入淡出、淡入缩放、缩放、移动、旋转动画效果。先看一下成果。 优雅的过渡动画&#xff0c;为你的页面添加另一份趣味&#xff01; 在你的选择器里插入 animation 属性&#xff0c;并添加框架内置的 keyframes 即可实现&#xff0…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划 主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …

【抖音直播小玩法】介绍

一、是什么 直播小玩法是基于抖音直播场景的新型实时互动内容。直播小玩法由开发者自主开发&#xff0c;接入平台并开放给抖音主播挂载使用。开发者提供创意&#xff0c;依托平台生态&#xff0c;获取收益。 介入标准&#xff1a; 企业开发者&#xff0c;暂不支持个人开发者…

DAMO-YOLO:实时目标检测设计的报告

ReadPaperhttps://readpaper.com/pdf-annotate/note?pdfId4748421678288076801eId1920373270663763712 Abstract 在本报告中&#xff0c;我们提出了一种快速准确的目标检测方法&#xff0c;称为DAMO-YOLO&#xff0c;它比最先进的YOLO系列实现了更高的性能。DAMO-YOLO 通过…

C++ Primer Plus: 第10章(2)

第10章编程题&#xff1a; &#xff08;1&#xff09; Account.h: #ifndef ACCOUNT_H_ #define ACCOUNT_H_#include <string>class Account { private:std::string name ;std::string code ;double money ; public:Account() ;Account(std::string Name, std::string Co…

Vue history和hash模式

目录 一、简介 一、简介 ~~~~~~~~ 在Vue.js中&#xff0c;路由模式是用来管理应用程序中不同页面之间的导航的机制。Vue Router支持两种常见的路由模式&#xff1a;history模式和hash模式。 History 模式&#xff1a; ~~~~~~~~ History模式使用浏览器的history.pushState API …

红帆OA SQL注入漏洞复现

0x01 产品简介 红帆iOffice.net从最早满足医院行政办公需求&#xff08;传统OA&#xff09;&#xff0c;到目前融合了卫生主管部门的管理规范和众多行业特色应用&#xff0c;是目前唯一定位于解决医院综合业务管理的软件&#xff0c;是最符合医院行业特点的医院综合业务管理平…

Lnton羚通关于如何使用nanoPC-T4 安装OpenCV?

nanoPC-T4 安装 OpenCV Note: OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation. Please download the latest FriendlyCore/FriendlyDesktop Image file from the following URL: http://do…

springboot 自定义注解

1、引入maven依赖&#xff08;版本太低也会导致不生效&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.7.10</version></dependency…

深度分析纳斯达克上市公司慧择的竞争优势和投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 一、保险行业的现状、竞争与机遇 在疫情期间&#xff0c;很多行业的经营理念与经营方式&#xff0c;甚至客户行为、客户需求都发生了变化&#xff0c;进而催生出新的机遇。保险行业亦是如此&#xff0c;受疫情影响&#xf…

用Python编程实现百度自然语言处理接口的对接,助力你开发智能化处理程序

用Python编程实现百度自然语言处理接口的对接&#xff0c;助力你开发智能化处理程序 随着人工智能的不断进步&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;成为了解决文本处理问题的重要工具。百度自然语言处理接口提供了一系…

腾讯开启2024校招,主要招聘5大类岗位

近日&#xff0c;腾讯的大动作一个接一个&#xff0c;前脚刚公布2023上半年财报&#xff0c;后脚就开启了2024校招&#xff0c;不得不让人感叹腾讯真速度&#xff01; 此次招聘对象为毕业时间在2023年9月至2024年8月期间的2024届应届毕业生&#xff0c;覆盖北上广深等多个城市…

异步编程框架Seastar介绍

使用Seastar进行异步(Asynchronout)编程 介绍 我们在本文中介绍的Seastar&#xff0c;是一个用于在现代多核机器上&#xff0c;编写高效复杂的服务器应用程序的C库。 传统上&#xff0c;用于编写服务器应用程序的编程语言库和框架已经分为两个不同的阵营&#xff1a;那些注重…

环境与能源创新专题:地级市绿色创新、碳排放与环境规制数据

数据简介&#xff1a;推动绿色发展&#xff0c;促进人与自然和谐共生是重大战略举措。绿色发展强调“绿水青山就是金山银山”&#xff0c;人与自然和谐共生重在正确处理生态环境保护与经济发展的关系。在着力于实现绿色发展的过程中&#xff0c;绿色创新是绿色发展的重要驱动因…

关于API数据接口获取商品的数据的说明

获取商品数据已经成为许多应用程序的重要组成部分。为了实现这一目标&#xff0c;许多公司和技术开发者使用API数据接口来获取相关数据。本文将详细介绍如何使用API数据接口获取商品数据&#xff0c;并使用Python作为编程语言示例来展示相关代码。 API数据接口是一种通信协议&…

WPF的CheckBox中的三个状态

WPF的CheckBox中的三个状态 CheckBox控件和RadioButton控件是继承自ToggleButton类&#xff0c;这意味着用户可切换他们的开关状态&#xff0c;其中IsChecked属性是可空的Boolean类型&#xff0c;这意味着该属性可以设置为true&#xff0c;false或null。 null值表示不确定状态…

spring.HttpMessageNotReadableException: JSON parse error

实体类如下&#xff1a; Value public class Search{//搜索内容String value;//是否模糊搜索boolean fuzzy true; //其实这样写并不是“默认”模糊搜索&#xff0c;而是“一定是”模糊搜索 }spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ins…

GPU Microarch 学习笔记 [1]

WARP GPU的线程从thread grid 到thread block&#xff0c;一个thread block在CUDA Core上执行时&#xff0c;会分成warp执行&#xff0c;warp的颗粒度是32个线程。比如一个thread block可能有1024个线程&#xff0c;分成32个warp执行。 上图的CTA&#xff08;cooperative thre…

10条SQL优化技巧

一、一些常见的SQL实践 &#xff08;1&#xff09;负向条件查询不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好习惯 可以优化为in查询&#xff1a; select * from order where status in(2,3) &#xff08;2&#xff09;前导模…