【C语言】指针笔试题

news2025/2/26 16:59:19

前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算!

文章目录

  • 一,指针笔试题
    • 1,题目一
    • 2,题目二
    • 3,题目三
    • 4,题目四
    • 5,题目五
    • 6,题目六
    • 7,题目七

一,指针笔试题

我们直接上题目:

1,题目一

下面程序运行的结果是什么?

#include <stdio.h> 
int main() 
{ 
	int a[5] = { 1, 2, 3, 4, 5 }; 
	int *ptr = (int *)(&a + 1); 
	printf( "%d,%d", *(a + 1), *(ptr - 1)); 
	return 0; 
}

分析如下:

首先要理解数组名的含义 区分a&a
a为数组首元素的地址; &a为整个元素的地址;&a+1跳过整个数组指向最后一个元素的末尾。
上面程序int *ptr = (int *)(&a + 1); 就是将数组最后一个地址强转为(int *)类型 赋给ptr
所以当我们打印*(a + 1)打印的就是第二个元素 2!
打印*(ptr - 1)时,由于ptr存放的是最后一个元素末尾的地址再-1就找到了最后一个元素的地址 解引用拿到最后一个元素 5!

答案如下:
在这里插入图片描述

2,题目二

下面程序运行的结果是什么?

//在X86环境下 
//假设结构体的⼤⼩是20个字节 
//程序输出的结果是啥? 
struct Test { 
	int Num; 
	char *pcName; 
	short sDate; 
	char cha[2]; 
	short sBa[4]; 
}*p = (struct Test*)0x100000; 
int main() 
{ 
	printf("%p\n", p + 0x1); 
	printf("%p\n", (unsigned long)p + 0x1); 
	printf("%p\n", (unsigned int*)p + 0x1); 
	return 0; 
} 

分析如下:

一, 首先看 0x100000 被强转成了结构体指针类型 p ,而且题目也告诉我们在X86环境下假设结构体的大小是20个字节。

  1. p+0x1 就相当于偏移了一个结构体的大小即20字节 二20字节转为16进制是 0x14 所以 p+0x1==0x100014

二,第二个打印的内容是将p强制类型转换为 unsigned long类型 我们知道在X86环境下long类型的数据是占4个字节的。

  1. 所以 unsigned long)p + 0x1就相当于p偏移一个unsigned long类型的大小 所以 unsigned long)p + 0x1 结果为0x100004吗?

注意这里有坑 :(unsigned long)p是将p转换成了整数啊!p此时已经不是指针了,所以不是指针加一而是整数加1! 而整数加1就是直接加一 所以结果为 0x100001

三,第三个打印的内容是将p强转为unsigned int*的类型,这时的p就是指针了,指针加一跳过一个unsigned int*类型该类型的大小为4个字节 所以结果为 0x100004

注意%p是C语言中用来格式化和打印指针变量的格式化符号。当你想打印一个指针变量的地址时,可以使用%p来输出该变量的地址值。

通过以上的分析我们首先要明白指针加一到底跳过多少字节?这取决于指针的类型,其实就是指针指向了什么类型的数据。
答案如下:
在这里插入图片描述

3,题目三

下面程序运行的结果是什么?

#include <stdio.h> 
int main() 
{ 
	int a[3][2] = { (0, 1), (2, 3), (4, 5) }; 
	int *p; 
	p = a[0]; 
	printf( "%d", p[0]); 
	return 0; 
}

分析如下:

这道题也有陷阱,题目考察的知识点就是对数组名的理解。但是如果我们没有认真看题而是直接去看p[0]打印的结果,这时我们就会认为结果是0,因为p[0]==a[0]为第一行第一个元素所以是0。但结果是错的为什么呢?

  1. 我们看到数组初始化用的是()小圆括号。
  2. 圆括号里边有逗号所以考的是逗号表达式
    所以数组其实是这样的:
    在这里插入图片描述
    回到题目我们就可以从数组直接看出答案为1

答案如下:
在这里插入图片描述

4,题目四

下面程序运行的结果是什么?

//假设环境是x86环境,程序输出的结果是啥? 
#include <stdio.h> 
int main() 
{ 
	int a[5][5]; //需要完整对应就需要一个int(*)[5]的数组指针
	int(*p)[4]; 
		p = a; 
	printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); 
	return 0; 
}

分析如下:

这里是引用
由上图我们需要知道2个点:

  1. 指针-指针的前提是两个指针指向同一个空间
  2. 指针-指针得到的结果的绝对值是两个指针之间的元素个数 并且小地址-大地址会得到负数
    我们知道&p[4][2]-&a[]4[2]==-4那么问题来了 -4以%p%d的形式打印的结果分别是什么呢?
  3. 以%d形式打印 结果就为 -4
  4. 以%p的形式打印就要注意了 前面说过%p是用来打印地址的 打印-4时会直接将内存中的值当作地址打印 而地址中存放的是16进制数 而-4的16进制数为0xFFFFFFFC

如果对于进制转换还不是很了解的话可以去看我之前写的进制转换这篇文章;传送门:进制转换

答案如下:
在这里插入图片描述

5,题目五

#include <stdio.h> 
int main() 
{ 
	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
	int *ptr1 = (int *)(&aa + 1); 
	int *ptr2 = (int *)(*(aa + 1)); 
	printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1)); 
	return 0; 
}

分析如下:
首先我们先将数组画出来:
在这里插入图片描述

本题主要注意区分aa与&aa,aa为二维数组首元素的地址而二维数组首元素为第一行的地址+1会跳过一行指向的第一行最后一个元素的末尾;&aa拿到的是整个二维数组的地址 +1会跳过一个二维数组 指向的是二维数组最后一个元素的末尾。
通过上面的分析我们不难得出答案是10和5

答案如下:
在这里插入图片描述

6,题目六

#include <stdio.h> 
int main() 
{ 
	char *a[] = {"work","at","alibaba"}; 
	char**pa = a; 
	pa++; 
	printf("%s\n", *pa); 
	return 0; 
}

分析如下:

这一题是一个关于二级指针的题,首先a是一个指针数组,*pa=a拿到了a数组的首地址"work",这其实相当于一个指针数组存放了三个类型为char*的字符串常量我们画图演示:
在这里插入图片描述
pa++就跳过了一个元素指向了"at"这个常量字符串 所以打印的结果就是"at"。

答案如下:
在这里插入图片描述

7,题目七

#include <stdio.h> 
int main() 
{ 
	char *c[] = {"ENTER","NEW","POINT","FIRST"}; 
	char**cp[] = {c+3,c+2,c+1,c}; 
	char***cpp = cp; 
	printf("%s\n", **++cpp); 
	printf("%s\n", *--*++cpp+3); 
	printf("%s\n", *cpp[-2]+3); 
	printf("%s\n", cpp[-1][-1]+1); 
	return 0; 
}

分析如下:
要解决这道题首先要把图给画好:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了这就是一些有关指针运算相关的练习了,如果有问题欢迎指出与我讨论。
感谢能够看到这里的读者,如果我的文章能够帮到你那我甚是荣幸,文章有任何问题都欢迎指出!制作不易还望给一个免费的三连,你们的支持就是我最大的动力!
在这里插入图片描述

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

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

相关文章

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

python与C系列语言的差异总结(3)

与其他大部分编程语言不一样&#xff0c;Python使用空白符&#xff08;whitespace&#xff09;和缩进来标识代码块。也就是说&#xff0c;循环体、else条件从句之类的构成&#xff0c;都是由空白符加上冒号(:)来确定的。大部分编程语言都是使用某种大括号来标识代码块的。下面的…

OpenCV(9):视频处理

1 介绍 视频是由一系列连续的图像帧组成的&#xff0c;每一帧都是一幅静态图像。视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。 视频分析: 通过视频处理技术&#xff0c;可以分析视频中的运动、目标、事件等。…

【C++设计模式】观察者模式(1/2):从基础到优化实现

1. 引言 在 C++ 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重解决观察者生命周期问题,提升代码的安全性、灵活性…

在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库

目录 在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库引言安装常见问题vim粘贴问题 环境情况环境信息安装包下载 初始环境准备关闭 SELinux关闭 firewalld 安装前初始化工作配置主机名安装依赖优化内核参数限制 Oracle 用户的 Shell 权限配置 PAM 模块配置swap创建用户组与用户,…

计算机毕业设计SpringBoot+Vue.js足球青训俱乐部管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…

QSplashScreen --软件启动前的交互

目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类&#xff0c;用于显示启动画面。它通常在应用程序启动时显示&#xff0c;以向用户显…

「软件设计模式」责任链模式(Chain of Responsibility)

深入解析责任链模式&#xff1a;用C打造灵活的请求处理链 引言&#xff1a;当审批流程遇上设计模式 在软件系统中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个请求需要经过多个处理节点的判断&#xff0c;每个节点都有权决定是否处理或传递请求。就像企业的请假审批…

蓝桥杯嵌入式客观题以及解释

第十一届省赛&#xff08;大学组&#xff09; 1.稳压二极管时利用PN节的反向击穿特性制作而成 2.STM32嵌套向量终端控制器NVIC具有可编程的优先等级 16 个 3.一个功能简单但是需要频繁调用的函数&#xff0c;比较适用内联函数 4.模拟/数字转换器的分辨率可以通过输出二进制…

low rank decomposition如何用于矩阵的分解

1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解&#xff08;Low Rank Decomposition&#xff09;是其中一种方法&#xff0c;旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积&#xff0c;从而降低复…

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件&#xff08;推荐、更容易&#xff09;4.2 加载.Safetensors文件&#xff08;不建议使用&#xff09; 5.配置大模型文件 参考&#xff1a; 1、 如…

JNA基础使用,调用C++返回结构体

C端 test.h文件 #pragma oncestruct RespInfo {char* path;char* content;int statusCode; };extern "C" { DLL_EXPORT void readInfo(char* path, RespInfo* respInfo); }test.cpp文件 #include "test.h"void readInfo(char* path, RespInfo* respInfo…

解锁养生密码,拥抱健康生活

在快节奏的现代生活中&#xff0c;养生不再是一种选择&#xff0c;而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问&#xff0c;而是一系列融入日常的简单习惯&#xff0c;每一个习惯都在为我们的健康加分。 早晨&#xff0c;当第一缕阳光洒进窗户&#xff0c…

OpenCV(6):图像边缘检测

图像边缘检测是计算机视觉和图像处理中的一项基本任务&#xff0c;它用于识别图像中亮度变化明显的区域&#xff0c;这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明: 函数算法说明适用场景cv2.Canny()Canny 边缘检测多阶段算法&#xff0c;检测效果较…

spark的一些指令

一&#xff0c;复制和移动 1、复制文件 格式&#xff1a;cp 源文件 目标文件 示例&#xff1a;把file1.txt 复制一份得到file2.txt 。那么对应的命令就是&#xff1a;cp file1.txt file2.txt 2、复制目录 格式&#xff1a;cp -r 源文件 目标文件夹 示例&#xff1a;把目…

OpenHarmony全球化子系统

OpenHarmony全球化子系统 简介系统架构目录相关仓 简介 当OpenHarmony系统/应用在全球不同区域使用时&#xff0c;系统/应用需要满足不同市场用户关于语言、文化习俗的需求。全球化子系统提供支持多语言、多文化的能力&#xff0c;包括&#xff1a; 资源管理能力 根据设备类…

创建私人阿里云docker镜像仓库

步骤1、登录阿里云 阿里云创建私人镜像仓库地址&#xff1a;容器镜像服务 步骤2、创建个人实例 步骤&#xff1a;【实例列表】 》【创建个人实例】 》【设置Registry登录密码】 步骤3、创建命名空间 步骤&#xff1a;【个人实例】》【命名空间】》【创建命名空间】 注意&am…

【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)

【LLM】本地部署LLM大语言模型可视化交互聊天&#xff0c;附常见本地部署硬件要求&#xff08;以OllamaOpenWebUI部署DeepSeekR1为例&#xff09; 文章目录 1、本地部署LLM&#xff08;以Ollama为例&#xff09;2、本地LLM交互界面&#xff08;以OpenWebUI为例&#xff09;3、本…

LLM之论文阅读——Context Size对RAG的影响

前言 RAG 系统已经在多个行业中得到广泛应用&#xff0c;尤其是在企业内部文档查询等场景中。尽管 RAG 系统的应用日益广泛&#xff0c;关于其最佳配置的研究却相对缺乏&#xff0c;特别是在上下文大小、基础 LLM 选择以及检索方法等方面。 论文原文: On the Influence of Co…