指针和数组笔试题解析(最详细解析,没有之一)

news2024/10/7 8:30:45

指针和数组笔试题解析(最详细解析,没有之一)

  • 前言
  • 1. 一维数组和指针相关笔试题
  • 2. 字符数组和指针相关笔试题
    • 2.1 题型一:
    • 2.2 题型二:
    • 2.3 题型三:
    • 2.4 题型四:
  • 3. 指针和字符串相关面试题
    • 3.1 题型一:
    • 3.2 题型二:
  • 4. 二位数组和指针相关面试题
  • 5. 总结
  • 6. 结尾

前言

指针和数组在许多编程场景中经常结合使用,比如通过指针来访问数组的元素、通过指针来遍历数组等。指针和数组的灵活应用可以帮助我们更好地处理和操作数据,提高程序的性能和效率,指针和数组在C语言中具有重要的地位和作用,它们是程序设计中不可或缺的重要概念。本文将详细解析指针和数组相关笔试题!!

1. 一维数组和指针相关笔试题

题目及解析:

int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));	//数组名单独放在sizeof内部,这里a表示整个数组,计算的是整个数组,为16(4*4)个字节
	printf("%d\n", sizeof(a + 0));//a表示首元素的地址,a+0还是表示首元素地址,是地址就是4/8个字节
	printf("%d\n", sizeof(*a));	//a表示首元素地址,*a表示首元素,大小为4个字节
	printf("%d\n", sizeof(a + 1));//a表示首元素地址,arr+1跳过一个整型长度指向第二个元素(2)的地址,是地址大小就是4/8个字节
	printf("%d\n", sizeof(a[1]));//a[1]取出的是第二个元素2,为int类型,大小为4个字节
	printf("%d\n", sizeof(&a));	//&a取出的是整个数组的地址,但只要是地址,大小都是4/8个字节

	printf("%d\n", sizeof(*&a));	
	//解读一:sizeof(*&a) ---> sizeof(a) ---> 同第一个为16字节
	//解读二:由于我们熟知对整型指针进行解引用得到的是整型;对字符指针进行接引用得到的是一个字符
	//		  这里&a表示数组指针,类型为int (*)[4],对它进行解引用操作得到的是一个数组,即*&a表示整个数组,大小为4*4即16个字节

	printf("%d\n", sizeof(&a + 1));
	//&a取出的是整个数组,&a+1跳过整个数组,指向的是第四个元素4的下一个元素的地址
	//但是地址大小就是4/8个字节

	printf("%d\n", sizeof(&a[0]));//&a[0]取出的是第一个元素1的地址,大小为4/8个字节
	printf("%d\n", sizeof(&a[0] + 1));//&a[0]+1表示取出首元素地址后向后移动一个整型字长,指向第二个元素2的地址,为4/8个字节

	return 0;
}

x64环境下运行结果:
在这里插入图片描述

2. 字符数组和指针相关笔试题

2.1 题型一:

题目及解析:

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	
	printf("%d\n", sizeof(arr));//数组名单独放在sizeof内部,这里的arr表示整个数组,计算的是整个数组的大小,单位是字节,总共6个字节
	printf("%d\n", sizeof(arr + 0));//arr表示数组首元素的地址,arr+0还是数组首元素的地址,是地址就是4/8个字节
	printf("%d\n", sizeof(*arr));//arr表示数组首元素的地址,*arr就是首元素,大小1个字节
	printf("%d\n", sizeof(arr[1]));//arr[1]就是第二个元素,大小是1个字节

	printf("%d\n", sizeof(&arr));//&arr是数组的地址,但是数组的地址也是地址,是地址就是4/8

	printf("%d\n", sizeof(&arr + 1));//&arr + 1是跳过整个数组后的地址,是地址就是4/8个字节
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素的地址,是4/8个字节
	return 0;
}

x64环境下运行结果:
在这里插入图片描述

2.2 题型二:

题目及解析:

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));//因为字符数组arr中没有\0,所以在求字符串长度的时候,会一直往后找,产生的结果就是随机值
	printf("%d\n", strlen(arr + 0));//arr + 0是首元素的地址,和第一个一样,也是随机值

	//printf("%d\n", strlen(*arr));//err, arr是数组首元素的地址,*arr就是数组首元素,就是'a'-97
	//strlen函数参数的部分需要传一个地址,当我们传递的是'a'时,'a'的ascii码值是97,那就是将97作为地址传参
	//strlen就会从97这个地址开始统计字符串长度,这就非法访问内存了
	//printf("%d\n", strlen(arr[1]));//err

	printf("%d\n", strlen(&arr));//&arr是数组的地址,数组的地址和数组首元素的地址,值是一样的
								 //那么传递给strlen函数后,依然是从数组的第一个元素的位置开始往后统计,结果为随机值

	printf("%d\n", strlen(&arr + 1));//&arr+1,跳过整个数组,结果为随机值
	printf("%d\n", strlen(&arr[0] + 1));//&arr[0] + 1是第二个元素的地址,结果为随机值
	return 0;
}

x64环境下运行结果:
在这里插入图片描述

2.3 题型三:

题目及解析:

int main()
{
	char arr[] = "abcdef";//[a b c d e f \0]
	printf("%d\n", sizeof(arr));//数组中共有7个元素,结果为7

	printf("%d\n", sizeof(arr + 0));//arr + 0是首元素的地址,结果为4/8
	printf("%d\n", sizeof(*arr));//*arr其实就是首元素,1个字节
	//*arr--> *(arr+0) -- arr[0]

	printf("%d\n", sizeof(arr[1]));//arr[1]是第二个元素,1个字节
	printf("%d\n", sizeof(&arr));//&arr是数组的地址,是地址就是4/8个字节
	printf("%d\n", sizeof(&arr + 1));//&arr + 1是跳过一个数组的地址,4/8
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0] + 1是第二个元素的地址 4/8
	return 0;
}

x64环境下运行结果:
在这里插入图片描述

2.4 题型四:

题目及解析:

int main()
{
	char arr[] = "abcdef";//[a b c d e f \0]

	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//6

	//printf("%d\n", strlen(*arr));//err,传的是首元素a
	//printf("%d\n", strlen(arr[1]));//err,传的是第二个元素b
	//strlen需要传过去的是指针,如果传字符会造成非法访问内存,报错

	printf("%d\n", strlen(&arr));//6
	printf("%d\n", strlen(&arr + 1));//&arr+1跳过整个数组,导致数组后面\0没有明确位置,导致结果为随机值
	printf("%d\n", strlen(&arr[0] + 1));//从第二个元素开始向后访问,结果为5
	return 0;
}

x64环境下运行结果:
在这里插入图片描述

3. 指针和字符串相关面试题

3.1 题型一:

题目及解析:

int main()
{
	char* p = "abcdef";
	
	printf("%d\n", sizeof(p));//p是一个指针变量,大小就是4/8个字节
	printf("%d\n", sizeof(p + 1));//p+1是'b'的地址,是地址大小就是4/8个字节
	
	printf("%d\n", sizeof(*p));//*p 就是'a',就是1个字节
	printf("%d\n", sizeof(p[0]));//p[0]--> *(p+0) --> *p ,大小为1个字节

	printf("%d\n", sizeof(&p));//&p -- char**,二级指针也是指针大小为4/8个字节
	printf("%d\n", sizeof(&p + 1));//*p+1本质上还是一个指针,大小为4/8个字节
	printf("%d\n", sizeof(&p[0] + 1));//4/8 , &p[0] + 1得到是'b'的地址 

	return 0;
}

x64环境下运行结果:
在这里插入图片描述

3.2 题型二:

**题目及解析:

//由于原理和上面完全一样,所以在此就不再累赘了
int main()
{
	char* p = "abcdef";

	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1));//5
	//printf("%d\n", strlen(*p));//err
	//printf("%d\n", strlen(p[0]));//err
	printf("%d\n", strlen(&p));//随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));//5
	return 0;
}

x64环境下运行结果:

4. 二位数组和指针相关面试题

**题目及解析:

int main()
{
	int a[3][4] = { 0 };

	printf("%d\n", sizeof(a));//sizeof(数组名)不管是一维数组还是二维数组都是表示整个数组,结果为3*4*4 = 48
	printf("%d\n", sizeof(a[0][0]));//大小为4

	printf("%d\n", sizeof(a[0]));//a[0]是第一行这个一维数组的数组名
	//数组名算是单独放在sizeof内部了,计算的是整个数组的大小,大小是16个字节

	printf("%d\n", sizeof(a[0] + 1));
	//a[0]作为第一行的数组名,没有单独放在sizeo内部,没有&
	//a[0]表示数组首元素的地址,也就是a[0][0]的地址
	//所以a[0]+1是第一行第二个元素的地址,是地址就是4/8个字节
	//
	printf("%d\n", sizeof(*(a[0] + 1)));//4
	//计算的是就是第一行第2个元素的大小

	printf("%d\n", sizeof(a + 1));//4 / 8
	//a是数组首元素的地址,是第一行的地址 int(*)[4]
	//a+1 就是第二行的地址

	printf("%d\n", sizeof(*(a + 1)));//16
	//*(a+1) --> a[1] -> sizeof(*(a+1))->sizeof(a[1]) 计算的是第二行的大小
	//a+1 --> 是第二行的地址,int(*)[4]
	//*(a+1) 访问的第二行的数组

	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]是第一行的地址 int(*)[4]
	//&a[0]+1 是第二行的地址 int(*)[4]

	printf("%d\n", sizeof(*(&a[0] + 1)));//16 计算的是第二行的大小

	printf("%d\n", sizeof(*a));//计算的是第一行的大小-16
	//a是数组首元素的地址,就是第一行的地址
	//*a 就是第一行
	//*a --> *(a+0) --> a[0]

	printf("%d\n", sizeof(a[3]));//16
	//sizeof在计算其大小时,其背后原理是sizeof操作符只关心其类型,根据类型来计算大小
	//并不会真正的访问内存,所以在此所谓的数组越界对sizeof计算其大小并没有太大关系
	return 0;
}

x64环境下运行结果:
在这里插入图片描述

5. 总结

1. sizeof(数组名),这里的数组表示的是整个数组,不管是一维数组还是二维数组计算的都是整个数组的大小。
2. &数组名,这里的数组名表示的也是整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名表示的都是首元素的地址。
4. sizeof计算大小时,其工作原理是根据其类型来判断的,并不会真正访问内存来计算大小。所以在计算数组大小过程中,即使出现数组越界,但对sizeof来说没有影响,依然可以计算其大小。

6. 结尾

本篇文章到此就结束了。创作不易,如果对你有帮助记得点赞加收藏哦。感谢您的支持!!

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

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

相关文章

华为云CodeArts Check代码检查插件3大版本使用指南

华为云CodeArts Check是自主研发的代码检查服务。为用户提供代码风格、通用质量与网络安全风险等丰富的检查能力,提供全面质量报告、便捷的问题闭环处理帮助企业有效管控代码质量,助力企业成功。 本插件致力于守护开发人员代码质量,成为开发…

【低代码专题方案】使用iPaaS平台下发数据,快捷集成MDM类型系统

01 场景背景 伴随着企业信息化建设日趋完善化、体系化,使用的应用系统越来越多,业务发展中沉淀了大量数据。主数据作为数据治理中枢,保存大量标准数据库,如何把庞大的数据下发到各个业务系统成了很棘手的问题。 传统的数据下发方…

英国大学生用AI写论文拿到1等成绩!ChatGPT写论文教程+提示词分享

今年期末季与往年的一大不同就是有了“哆啦C梦”——ChatGPT。过于高效智能的它,上线初期就引起了学术界关于“学术不端”的热烈讨论… 目录 01.用AI写论文获1等成绩 02.如何用ChatGPT辅助学习/写作 01.迅速get知识点 02.辅助理解内容 03.辅助起草论文大纲 0…

3Ds max入门教程:创建埃菲尔铁塔

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 创建任何细节并不总是必要的,有时在场景中您需要在后台添加一些元素,这给人的印象是事件正在特定地点发生。这种方法可以节省大量的时间和精力。因此,在本教程中&#xf…

SpringBoot整合ZooKeeper完整教程

目录 ZooKeeper简单介绍 一、安装zookeeper 二、springboot整合zookeeper ZooKeeper简单介绍 zookeeper是为分布式应用程序提供的高性能协调服务。zookeeper将命名、配置管理、同步和组服务等常用服务公开在一个简单的接口中,因此用户无需从头开始编写这些服务。可…

【SpringBoot3】--03.数据访问、基础特性(外部化和内部外配置、整合JUnit)

文章目录 SpringBoot3-数据访问1.整合SSM场景1.1创建SSM整合项目1.2配置数据源1.3配置MyBatis1.4CRUD编写 2.自动配置原理3.扩展:整合其他数据源3.1 Druid 数据源 SpringBoot3-基础特性1. SpringApplication1.1 自定义 banner1.2.自定义 SpringApplication1.3Fluent…

【ELK企业级日志分析系统】部署Filebeat+ELK详解

部署FilebeatELK详解 1. 部署Filebeat节点1.1 部署Apache服务1.2 部署Filebeat服务 2. filter插件2.1 grok正则捕获插件2.1.1 内置正则表达式调用2.1.2 自定义表达式调用2.1.3 设置正则表达式过滤条件 2.2 mutate数据修改插件2.2.1 Mutate过滤器常用的配置选项2.2.2 Mutate过滤…

ROS2学习(一 、ROS2安装)

ROS2官方安装 https://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html 本来想找一下和ros1一样的安装指导文档,可以根据自己的系统选择。不过没有找到一个直接的说明教程。 不过在ROS2的各个版本安装说明里面有写支持哪些版本的系统。 比如我…

AWS 中文入门开发教学 45- Cloud9 - Node.js的开发与调试

知识点 在 Cloud9 环境中开发调试 Node.js 应用程序实战演习 $ mkdir expressweb $ cd expressweb $ npm init -y $ npm install express --save $ nano app.js ... $ curl http://httpbin.org/ip #查看当前主机的ip地址 $ node app.jscloud9还提供了一个非常好用的debug工具:…

23款迈巴赫S480新提车升级头等舱行政四座,五座改四座案例改装

新款的迈巴赫S480五座改四座成了必改的配置,改装的车主非常的多,不仅提供宽大的空间,而且后排中央扶手马鞍处还增加了一块Pad,用来控制空调,遮阳帘等。更有一众黑科技提供的后排乘客的舒适性。一起来看看五座迈巴赫S48…

Android 学习笔记: 三种基本布局的使用介绍

一、概述 布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而编写出精美的界面。 布局的内部除了放置控件外,也可以放置布局。 三种常用布局 LinearLayoutRelativeLayoutFrameLayout 二、 LinearLayout …

列举几个常用的淘宝API接口(详情页面数据接口,评论接口,关键词搜索接口,店铺所有商品接口)

目前各大电商平台都有自己的开放平台,通过API接口开放本电商平台的相关数据和功能,以自由开放的姿态来占领更多的市场份额。也让更多的人能来电商市场分得一杯羹。 下面列举几个常用的API接口,量大择优hui, 注册key和secret可测…

基于SpringBoot+Vue的校园博客系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

mysql将某一列的数据根据固定字符拆分后判断存不存在

如果数据库的某个字段在存储时是用的逗号分割,如下图所示: 例如这张表中有一个字段是用的逗号分割,其实这种设计违背了数据库三范式设计原则,如何判断这一列的值包不包含某一个值? 方法一 用mysql自带的字符串函数去判…

浅析路灯电击安全问题与选型

摘要:介绍了路灯设计安全防护的几个要点,简单分析了路灯低压配电接地系统形式TN-S和TT的选择及剩余电流保护装置在路灯设计中设置的必要性,列举了路灯灯具和灯杆的一些安全技术质量要求。 关键词:路灯配电系统接地形式&#xff1b…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud与 LangChain 集成搭建智能文档问答系统

目录 准备工作 主要参数 准备数据 开始提问 本文将演示如何使用 Zilliz Cloud 和 LangChain 搭建基于大语言模型(LLM)的问答系统。在本例中,我们将使用一个 1 CU 的 Cluster,还将使用 OpenAI 的 Embedding API 来获取指定文本的向量表示。现在就让我们开始吧。 准备工作…

谈谈对SpringMVC的理解

1、SpringMVC是属于SpringFramework生态里面的一个模块,它是在Servelet基础上构建的,并且使用了MVC模式设计的一个Web框架; 2、它的主要目的是为了简化传统模式下的Serveletjsp的开发模式,其次SpringMVC的架构模式是对于Java的web…

基于CrowdHuman数据集的高精度行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于CrowdHuman数据集的高精度行人检测系统可用于日常生活中检测与定位行人目标,利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…

计组 第四章 错题

4.1 13 汇编指令能看到什么 II 体系结构没有变 小端法

# Java 并发编程的艺术(三)

Java 并发编程的艺术(三) 文章目录 Java 并发编程的艺术(三)Java 内存模型Java 内存模型的基础Java 内存模型的抽象结构从源代码到指令序列的重排序 重排序happens-beforeJMM 的设计happens-before 的定义 Java 中的锁Lock 接口代…