练习-指针笔试题

news/2025/2/12 22:01:29/

目录

  • 前言
  • 一、一维整型数组
    • 1.1 题目一
    • 1.2 题目二
  • 二、二维整型数组
    • 2.1 题目一
    • 2.2 题目二
    • 2.3 题目三
  • 三、结构体
    • 3.1 题目一(32位机器运行)
  • 四、字符数组
    • 4.1 题目一
    • 4.2 题目二
  • 总结


前言

本篇文章记录关于C语言指针笔试题的介绍。


一、一维整型数组

1.1 题目一

在这里插入图片描述
题目分析

arr是首元素地址,即&arr[0]
&arr取的是整个数组的地址,类型为int(*)[5],&arr+1跳过整个数组的大小

在这里插入图片描述


1.2 题目二

在这里插入图片描述

题目分析

%x 按16进制格式输出
&arr取出的是整个数组的地址,&arr+1为跳过整个数组的地址
ptr1指向数组最后一个元素的末尾
ptr1[-1] -> *(ptr1+(-1)) ->*(ptr1-1),ptr1[-1] = 00000004
arr表示首元素地址,即&arr[0], (int)arr+1将地址强制转换为整型,进行加法运算
ptr2指向的是数组第一个元素的第二个字节,*ptr2操作四个字节,*ptr2 = 20000000

下图以32位机器为例,将1,2, 3, 4分别按16进制在内存中的存储位置如下
整数1的十六进制 00 00 00 01 高位->低位
整数2的十六进制 00 00 00 02
整数3的十六进制 00 00 00 03
整数4的十六进制 00 00 00 04
在这里插入图片描述


二、二维整型数组

2.1 题目一

在这里插入图片描述
题目分析

数组初始化时,利用了逗号表达式,逗号表达式的结果为最后一个表达式的结果,相当于以下的初始化方式
int arr[3][2] = { {1,3}, {5,0}, {0,0}};
arr[0]表示第一行的数组名,数组名表示首元素地址,相当于&arr[0][0]
则p[0] -> *(p+0) -> *( p) -> *(&arr[0][0]) -> arr[0][0] = 1


2.2 题目二

在这里插入图片描述
题目分析

指针变量p是一个数组指针,指向4个整型元素的数组
p[4][2] - >*( *(p+4) + 2)
两个相同类型指针相减的绝对值为相差的元素个数
&p[4][2]和&arr[4][2]的位置如下如所示
&p[4][2]和&arr[4][2]相差4个元素,则 &p[4][2] - & arr[4][2] = -4
-4的原反补如下
原码:1000 0000 0000 0000 0000 0000 0000 0100
反码:1111 1111 1111 1111 1111 1111 1111 1011
补码:1111 1111 1111 1111 1111 1111 1111 1100
%d输出的是原码 -4
%p输出的是地址,十六进制 ff ff ff ff ff ff ff fc

在这里插入图片描述


2.3 题目三

在这里插入图片描述
题目分析

&arr,取整个二维数组的地址,&arr+1跳过一个二维数组大小
*(arr+1),arr数组名,为首元素地址,第一行的地址,arr+1为第二行的地址
*(arr+1) -> arr[1],第二行的数组名,第二行第一个元素的地址

在这里插入图片描述


三、结构体

3.1 题目一(32位机器运行)

在这里插入图片描述
题目分析

将一个十六进制数0x100000强制转换为结构体指针变量的值,则p = 0x00100000
p+0x01,结构体指针变量p向前走一步,结构体占20个字节,则跳过20个字节,20的十六进制为00000014
00100000 + 00000010 = 00100014
(unsigned long)p+0x01,(unsigned long)p将p强制转换为一个无符号长整型,则进行整型的加法运算
00100000 + 00000001 = 00100001
(unsigned int*)p+0x01,(unsigned int*)p将p强制转换为一个整型指针变量,向前走一步跳过4个字节
00100000 + 00000004 = 00100004


四、字符数组

4.1 题目一

在这里插入图片描述
题目分析

ps为二级指针变量
str为数组名,表示首元素地址,即char*的地址
ps++, ps = ps+1,跳过一个char*的大小

在这里插入图片描述


4.2 题目二

在这里插入图片描述
题目分析

		表达式一: **++pps,++pps, pps = pps+1; pps指向ps[1]**(pps) == str[2]; 得到字符串"POINT"首元素地址表达式二: * -- * ++pps + 3, 这时的pps指向ps[1]++pps, pps = pps+1; pps指向ps[2]*(pps) == ps[2]; 得到指向str[1]的地址--*(pps),得到指向str[0]的地址*--*(pps),得到字符串"ENTER"的首元素地址*--*(pps)+3,跳过3个字符的大小,得到字符串"ENTER"中字符'E'的地址表达式三: *pps[-2]+3,这时的pps指向ps[2]pps[-2] == *(pps-2),这里的pps不会改变,但表达式(pps-2)指向的是ps[0]*(pps-2) == ps[0]*pps[-2] == *ps[0],得到指向"FIRST"的首元素地址,即字符F的地址*pps[-2] +3, 向前走三步,得到"FIRST"字符'S'的地址表达式四: pps[-1][-1]+1,这时pps指向ps[2]pps[-1][-1] == *(*(pps-1)-1);*(pps-1),得到ps[1],即得到指向str[2]的地址*(pps-1-1,得到指向str[1]的地址*(*(pps-1-1),得到字符串"NEW"首元素地址,即字符'N的地址'*(*(pps-1)-1)+1,跳过一个字符,得到字符串"NEW"中字符'E'的地址

在这里插入图片描述


总结

本篇文章解析了指针在各种数组应用的练习题,解决这种题目,最好的方法就是画图。


http://www.ppmy.cn/news/1297878.html

相关文章

2024 年 API 安全:预测和趋势

随着技术以前所未有的速度不断进步,API(应用程序编程接口)安全性的复杂性也随之增加。随着 API 在现代应用程序和服务中的激增,组织将需要更好地了解其 API 环境以及 API 给运营带来的风险。 到 2024 年,预计几个关键…

C++推箱子游戏开发

游戏 自动地图生成背景音乐推箱子到目标位置 美工资源 美工资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MZv8pDBXdNDbXxuAAPSM-A **提取码&#xff1a;**2syq 图形库: www.easyx.cn cpp文件 #include "box_man.h" #include <conio.h> #…

18款Visual Studio实用插件(更新)

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些Visual Studio实用插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件希望对大家有用&#xff0c;大家有更好的插件推荐可在文…

大前端nestjs入门教程系列(四):如何nestjs整合mysql数据库

经过前面的几篇文章&#xff0c;想必大家已经对nestjs有了基础的了解&#xff0c;那么这篇文章就带大家玩玩数据库&#xff0c;学会了这篇&#xff0c;就离大前端又进了一步 Nest与数据库无关&#xff0c;使你可以轻松地与任何 SQL 或 NoSQL 数据库集成。 根据你的喜好&#xf…

人工智能_机器学习091_使用三维瑞士卷数据_KMeans聚类算法进行瑞士卷数据聚类---人工智能工作笔记0131

然后我们首先来构建一下数据 准备瑞士卷数据: import numpy as np 导入数学计算包 import matplotlib.pyplot as plt 导入画图包 #自底向上聚类 from sklearn.cluster import AgglceerativeClustering 导入分层聚类模型 from sklearn.datasets import make_swiss_roll # 瑞士卷…

强化学习在生成式预训练语言模型中的研究现状简单调研

1. 绪论 本文旨在深入探讨强化学习在生成式预训练语言模型中的应用&#xff0c;特别是在对齐优化、提示词优化和经验记忆增强提示词等方面的具体实践。通过对现有研究的综述&#xff0c;我们将揭示强化学习在提高生成式语言模型性能和人类对话交互的关键作用。虽然这些应用展示…

极客时间-《如何成为学习高手》文章笔记 + 个人思考

极客时间-《如何成为学习高手》文章笔记 个人思考 底层思维高效学习05&#xff5c;教你全面提升专注力&#xff0c;学习时不再走神06&#xff5c;教你高效复习&#xff1a;巧用学习神器取得好成绩07&#xff5c;我考北大中文系时&#xff0c;15 天背下 10 门专业课的连点成线法…

logrus 打印日志时间注意事项

问题描述 程序运行中打印时间 和 logrus打印日志时间 差距十几分钟 go 日志打印处 log_init.LogIcmp.Info("Current time") 日志打印结果 {"func":"main.main","level":"info","msg":"Current time",…