【C语言】指针笔试题
前言:上期我们介绍了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个字节。
p+0x1就相当于偏移了一个结构体的大小即20字节 二20字节转为16进制是0x14所以p+0x1==0x100014二,第二个打印的内容是将p强制类型转换为
unsigned long类型我们知道在X86环境下long类型的数据是占4个字节的。
- 所以
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
答案如下:

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个点:
- 指针-指针的前提是两个指针指向同一个空间
- 指针-指针得到的结果的绝对值是两个指针之间的元素个数 并且小地址-大地址会得到负数
我们知道&p[4][2]-&a[]4[2]==-4那么问题来了 -4以%p和%d的形式打印的结果分别是什么呢?- 以%d形式打印 结果就为 -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;
}
分析如下:
要解决这道题首先要把图给画好:




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

相关文章:
【C语言】指针笔试题
前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…...
深入理解Redis:数据类型、事务机制及其应用场景
在当今快速发展的技术领域中,Redis作为一种高性能的内存数据库,已经被广泛应用于各种场景,从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性,如事务处理、持久化选项、高…...
RGMII(Reduced Gigabit Media Independent Interface)详解
一、RGMII的定义与作用 RGMII(精简版千兆介质无关接口)是一种用于千兆以太网(1Gbps)的高效接口标准,旨在减少传统GMII接口的引脚数量,同时保持相同的传输速率。其核心作用包括: 减少引脚数量&a…...
学习Flask:Day 1:基础搭建
学习目标:完成第一个Flask应用 # app.py from flask import Flask app Flask(__name__)app.route(/) def home():return <h1>Hello Flask!</h1>app.route(/api/greet/<name>) def greet(name):return {message: fHello {name}!}if __name__ __…...
XTOM工业级蓝光三维扫描仪在笔记本电脑背板模具全尺寸检测中的高效精准应用
——某3C精密制造企业模具优化与质量管控案例 镁合金具有密度小、强度高、耐腐蚀性好等优点,成为笔记本电脑外壳主流材料。冲压模具作为批量生产笔记本电脑镁合金背板的核心工具,其精度直接决定了产品的尺寸一致性、结构可靠性与外观品质。微米级模具误…...
网络安全 机器学习算法 计算机网络安全机制
(一)网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型: 自主访问控制强制访问控制 访问控制措施: 入…...
分享些常用的工具类
一、照片 1、Unsplash:https://unsplash.com/ 2、pixabay:https://pixabay.com/zh/ 二、壁纸 1、Wallpaper Engine 2、wallhaven:https://wallhaven.cc/ 3、极简壁纸:https://bz.zzzmh.cn/ 三、AI语音 1、微软Azure项目&…...
VUE四:Vue-cli
什么是Vue-cli vue-cli是官方提供的一个脚手架,用于快速生成一个vue的项目模板; 预先定义好的目录结构及基础代码,就好比咱们在创建 Maven项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; 什么是web pack 本质上&#…...
以下是自定义针对 Vite + TypeScript 项目的完整路径别名配置流程:
以下是针对 Vite TypeScript 项目的完整路径别名配置流程: 1. 安装必要依赖 bash npm install -D types/node 2. 配置 vite.config.ts typescript // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pat…...
LangGraph系列教程:基于状态构建上下文感知的AI系统
本文深入探讨LangGraph中的“状态”概念及其在AI工作流中的核心作用。通过基础状态(如计数器)和复杂状态(含消息历史)的定义,结合代码示例,演示如何通过函数式编程实现状态的不可变修改。然后进一步解析了如…...
图像处理、数据挖掘、数据呈现
目录 图像处理方法 阈值分割 图像处理方法 图像平滑 图像锐化 图像增强 阈值分割 边缘检测 阈值分割 特征提取 提取边界 区域提取 主成分压缩 POI 多源数据 数据挖掘 多源数据提取 关联度提取 位置集群, 新闻事件, 权限 个人喜好 历史…...
利用python和gpt写一个conda环境可视化管理工具
最近在学习python,由于不同的版本之间的差距较大,如果是用环境变量来配置python的话,会需要来回改,于是请教得知可以用conda来管理,但是conda在管理的时候老是要输入命令,感觉也很烦,于是让gpt帮…...
sort_values、sort 和 sorted 的区别与用法详解
sort_values、sort 和 sorted 是 Python 中用于排序的工具,但它们的适用场景和行为有所不同。以下是它们的区别和用法详解: 1. sort_values 适用对象 Pandas 的 Series 或 DataFrame。 功能 对 Pandas 数据结构中的值进行排序。 特点 专为 Pandas 设…...
银行系统功能架构设计元模型
1. 元模型核心目标 规范性:定义功能模块的标准化描述方式,便于跨团队协作。可复用性:抽象通用组件,减少重复开发。可扩展性:支持未来业务创新和技术升级(如开放银行API集成)。2. 元模型层级结构 采用分层架构模式,分为以下核心层级: **(1) 业务功能层** …...
rabbitmq 延时队列
要使用 RabbitMQ Delayed Message Plugin 实现延时队列,首先需要确保插件已安装并启用。以下是实现延时队列的步骤和代码示例。 1. 安装 RabbitMQ Delayed Message Plugin 首先,确保你的 RabbitMQ 安装了 rabbitmq-delayed-message-exchange 插件。你可…...
idea + Docker + 阿里镜像服务打包部署
一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…...
Vue 3 零基础入门:从计数器应用开始你的工程化之旅 - 深入理解 Vue 3 响应式系统
引言 欢迎来到 Vue 3 + 现代前端工程化 系列技术博客! 本系列博客旨在通过每日构建一个小项目,帮助您深入学习 Vue 3 的各项核心特性,并掌握现代前端工程化的实践技能。 在接下来的系列文章中,我们将从零开始,由浅入深,逐步构建一系列实用的小型应用。 今天,作为本系列…...
批量将手机照片修改为一寸白底证件照的方法
生活中经常需要用到一寸白底证件照,但每次去照相馆拍摄既费时又麻烦。其实,利用手机拍照和批量证件照生成工具,就能轻松批量修改手机照片为一寸白底证件照。 首先,在电脑浏览器中打开【报名电子照助手】,找到“批量证件…...
【Docker基础】理解 Docker:本质、性质、架构与核心组件
文章目录 Docker 本质Docker 的引擎迭代Docker 和虚拟机的区别Docker 为什么比虚拟机资源利用率高,速度快?Docker 和 JVM 虚拟化的区别Docker 版本1. LXC (Linux Containers)2. libcontainer3. Moby4. docker-ce5. docker-ee总结: Docker 架构…...
LeetCodehot 力扣热题100 全排列
这段代码的目的是计算给定整数数组的所有全排列(permutations),并返回一个包含所有排列的二维数组。 思路解析 在这段代码中,采用了 深度优先搜索(DFS) 和 回溯 的方法来生成所有的排列。 关键步骤…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...



