【C语言】指针笔试题解析

news2024/12/28 19:16:35

大家好,我是苏貝,本篇博客带大家了解指针和数组笔试题解析,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


1.

下面程序的结果是什么?

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

结果:2,5
&a表示取出整个数组a的地址,再+1表示跳过该数组,取出后面同类型的地址,即5个int型的地址即橙色区域,对&a+1进行强制类型转化后赋值给ptr,所以ptr指向的是数组后面的第一个地址。ptr-1表示数组a的最后一个元素的地址,对地址进行解引用找到最后一个元素5。a是首元素地址,a+1表示第二个元素的地址,对地址进行解引用找到第二个元素2
在这里插入图片描述

2.

//这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);//1
	printf("%p\n", (unsigned long)p + 0x1);//2
	printf("%p\n", (unsigned int*)p + 0x1);//3
	return 0;
}

结果:0x100014 ;0x100001;0x100004
1.0x是16进制的前缀,所以0x1也就是1,可知p是结构体指针,p+1即结构体指针+1表示跳过一个结构体的大小,所以p的地址要加20=0x14,所以结果为0x100014 ;
2.p原本存储的是地址,但按题目要将p进行强制类型转化成unsigned long类型,即此时p里面存储的不再是地址而是数字0x100000,再+1得0x100001,再将数字0x100001作为地址打印
3.p原本是结构体指针,现被强制类型转化为整型指针,所以p+1跳过4个字节,所以p的地址要加4=0x4,所以结果为0x100004 ;

3

数据以小端存储模式存储

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

结果:4,2000000
由第1题知,ptr1指向的是数组后面的第一个地址,ptr1[-1]== * (ptr-1)即数组第四个元素4;
数组名a原本是首元素地址,设首元素地址为0x11223300,后来将a强制类型转化为int型,所以此时的0x11223300为数字而非地址,+1变为0x11223301,再将(int)a + 1强制类型转化为int * 类型,即又把0x11223301当成地址赋值给指针变量ptr2,这个地址在首元素地址后1个,又因为数据以小端存储模式存储(数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中),画出数组第1、2个元素的内存图(如下),对ptr进行解引用找到从ptr指向的内容到后面的3个字节的内容(下图中有黄色线条区域),将内存图的数据转化为现实数据即0x02000000,以16进制输入得2000000
在这里插入图片描述

4

int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

结果:1
(0, 1), (2, 3), (4, 5)都是逗号表达式,所以数组a的元素为1,3,5,0,0,0,a[0]是一个一维数组,存储的是数组a第一行的元素,数组名是首元素地址,即将第一行第一个元素的地址传给p,p[0]= * (p+0)=1

5

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	return 0;
}

结果:0xFFFFFFFC,-4
下图中橙色部分是&p[4][2],蓝色部分是&a[4][2],指针-指针的绝对值=两指针之间的元素个数=4,因为&p[4][2]<&a[4][2],所以 &p[4][2] - &a[4][2]= -4。-4在内存中以补码的形式存储,-4的原码:10000000 00000000 00000000 00000100;-4的反码:11111111 11111111 11111111 11111011;-4的补码:11111111 11111111 11111111 11111100;以地址的形式进行打印,得到FFFFFFFC;以十进制进行打印就是-4。
但我们要知道,p的类型是int( * )[4],而数组名a即首元素地址的类型为int( * )[5],两者的类型不同,在编译时编辑器会报警告
在这里插入图片描述

6

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;
}

结果:10,5
由题目1知,ptr1-1指向的是数组最后一个元素的地址,对地址解引用找到最后一个元素10;* (aa+1) == aa[1],且前面没有sizeof和&,所以aa[1]表示第二行的首元素地址即第6个元素即元素6的地址,该地址本身就是int * 型的,所以强制类型转化无意义,ptr2指向的是第6个元素即元素6的地址。ptr2-1指向的是第5个元素的地址,对地址解引用找到第5个元素5

7

int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

结果:at
未进行pa++操作前,a,pa的关系如图,pa指向的是数组a的首元素地址
在这里插入图片描述
pa++后,pa指向的是数组a的第二个元素的地址

在这里插入图片描述
对pa解引用找到第二个元素,类型为char * ,即第二个元素中存储的是字符串at中a的地址。要打印字符串,通过第二个元素找到字符串at,遇’\0’停止

8

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;
}

结果:POINT; ER ;ST; EW

阅读前3行代码,我们可以画出下面表示c、cp、cpp关系的图(修正:ENTRY改为ENTER)
在这里插入图片描述
在进行第四条语句时,因为++的优先级高于 * ,所以cpp先自增1,此时cpp指向的是数组cp的第二个元素,对cpp解引用找到数组cp的第二个元素,类型为char * * ,再对元素解引用找到数组c的第三个元素,类型为char * ,要打印字符串,通过第三个元素找到字符串POINT,遇’\0’停止
在这里插入图片描述
在进行第5条语句之前,c、cp、cpp关系的图如上(修正:ENTRY改为ENTER)。进行第5条语句,+的优先级在该语句中最低,所以最后再+3。cpp先自增1,此时cpp指向的是数组cp的第三个元素,对cpp解引用找到数组cp的第三个元素,类型为char * * ,内容为c+1,自减1后变成c,所以此时数组cp的第三个元素指向数组c的第一个元素,类型为char * ,要打印字符串,通过第一个元素找到字符串ENTER,+3后找到字符串ENTER的E,遇’\0’停止,所以结果为ER
在这里插入图片描述
在进行第6条语句之前,c、cp、cpp关系的图如上(修正:ENTRY改为ENTER)。cpp[-2]== * (cpp-2)找到数组cp的第一个元素,类型为char * * ,对元素解引用找到数组c的第四个元素,,类型为char * ,要打印字符串,通过第四个元素找到字符串FIRST,+3后找到字符串FIRST的S,遇’\0’停止,所以结果为ST

第6条语句并没有改变c、cp、cpp的关系。进行第7条语句,cpp[-1][-1]== * (* (cpp-1)-1),cpp-1指向数组cp的第二个元素,对元素解引用找到数组cp的第二个元素,再-1指向数组c的第二个元素,对元素解引用找到数组c的第二个元素,要打印字符串,通过第二个元素找到字符串NEW,+1后找到字符串NEW的E,遇’\0’停止,所以结果为EW


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

闪光激光雷达实现无人驾驶导航

一艘宇宙飞船盘旋在灰色、布满陨石坑的月面上&#xff0c;扫描着它的着陆点&#xff0c;然后&#xff0c;在火箭的火焰中&#xff0c;扬起大量尘埃的火焰中&#xff0c;着陆器“墨菲斯”安全稳定地下降到一个空旷的地方。在布满碎石的岩石表面。 事实上&#xff0c;2014 年的这…

JavaFx学习问题1--图片不显示问题

需要注意的点也就是两个 1.路径问题 如果是绝对路径那么格式是file: 绝对路径 如下图所示   如果不加直接给你报错 如果是相对路径格式是相对于src下的相对路径&#xff0c;但头部不加src 如下图 如果加了src&#xff0c;则跟绝对路径一样&#xff0c;要在前面写个file…

python GUI

Python tkinter快速可视化开发GUI界面指南&#xff1a;详细教程(附带工具)_tkinter 可视化_德宏大魔王的博客-CSDN博客 这个案例&#xff1a; 1、GUI 简介 GUI 有好多实现方式&#xff1b;组件 我们选择tkinter 实现&#xff1b; 2、Tkinter 组件 3、拖拽的方式实现Tkinter…

【操作系统笔记十一】进程间通信

Linux文件系统 inode 节点 &#xff08;index node&#xff09;&#xff1a;给每个文件赋予一个称为 i 节点的数据结构。 inode 一开始是存储在硬盘中的&#xff0c;只有当文件被打开的时候&#xff0c;其对应的 i 节点才加载到内存中。 总结&#xff1a; Linux 中&#xff0c…

Linux的socket通信

关于套接字通信定义如下&#xff1a; 套接字对应程序猿来说就是一套网络通信的接口&#xff0c;使用这套接口就可以完成网络通信。网络通信的主体主要分为两部分&#xff1a;客户端和服务器端。在客户端和服务器通信的时候需要频繁提到三个概念&#xff1a;IP、端口、通信数据&…

SAP FI FS10N排除特定凭证类型

财务要求 需要把CO类型的凭证去掉&#xff0c;经过调试发现 筛选条件在GT_selection 在这个函数里面做个增强试试 *----------------------------------------------------------------------* ***INCLUDE FAGL_FILL_GT_SELECTIONS . *------------------------------------…

全流程ARCGIS Pro技术应用教程

详情点击公众号链接&#xff1a;全流程ARCGIS Pro技术应用教程 前沿 GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关…

shap-Basic SHAP Interaction Value Example in XGBoost

Basic SHAP Interaction Value Example in XGBoost XGBoost中的基本SHAP交互值示例解释没有交互的线性函数SHAP交互值用一次交互解释线性模型SHAP交互值 用到的环境是python3.7&#xff08;基于上一篇文章的环境&#xff09;&#xff0c;然后再装了xgboost和shap&#xff0c;没…

GIT 提交过滤非必要文件

1、git ls-files&#xff1a;该命令会列出Git仓库中管理的所有文件 2、git rm -r -f --cached . -f 是强制删除 最后的点 是删除所有 git rm -r --cached . 3、 进入Preferences->plugins 中下载一个(.ignore)插件  在项目本地new一个(.gitignore)的文件新增需要过滤文…

最全跨境独立站建站详细步骤解析

对于跨境电商卖家来说&#xff0c;无论是规避“鸡蛋放在同一个篮子里”的风险&#xff0c;还是追求更多的销售额和利润&#xff0c;多平台、多站点的布局都是其至关重要的战略。加之市场的变化带来了新的发展机遇&#xff0c;这也使得如今很多出海企业都在抢占独立站新风口。然…

四、线性支持向量机算法(LinearSVC,Linear Support Vector Classification)(有监督学习)

线性支持向量机&#xff0c;Linear Support Vector Classification. 与参数内核为线性的SVC类似(SVC(kernel‘linear’))&#xff0c;但使用liblinear而非libsvm实现&#xff0c;因此在选择惩罚和损失函数时更具灵活性&#xff0c;并能更好地扩展到大量样本 SVC(kernel’linea…

【沐风老师】3DMAX路径拖尾光线刀光效果插件GhostTrails教程

3DMAX路径拖尾光线刀光效果插件GhostTrails&#xff0c;是3dsmax的动画挤出修改器。它非常适合风格化的运动模糊效果、轮胎轨迹、Tron光循环和许多其他用途。 【适用版本】 3dMax2010 - 2024 【安装方法】 1.将对应版本的GhostTrails 插件复制到 3dmax 插件目录&#xff08;如…

原创动画《优弧,你小子!》

&#x1f4a5; 背景 体验效果直接翻到第三章&#xff1a;成果体验 先来介绍一下优弧&#xff1a;掘金平台管理员丨首席客服君丨运营负责人 &#x1f468;‍✈️ 现在优弧到底是妹子还是汉子仍是一个未解之谜&#xff0c;网上众说纷纭。他说&#xff1a;优弧是个200来斤的胖子&a…

AIGC赋能甄知燕千云员工AI助手,升级企业智创之旅

燕千云数智化业务服务平台发布了1.24.0版本&#xff0c;此次版本升级了燕千云智能工单&#xff0c;增加了一键外呼功能&#xff0c;并且优化了在线客服接入了失败通知&#xff0c;满足不同的用户需求&#xff0c;此次还升级了智能助理&#xff0c;知识中心等功能&#xff0c;满…

[计算机入门] Windows附件程序介绍(影音类)

3.12 附件程序介绍(影音类) 3.12.1 附件程序介绍 附件程序是在安装完Windows系统后&#xff0c;系统自带的一些非常常用且重要的软件程序。可以通过下面的方式搜索并打开附件程序(以打开画图程序为例)&#xff1a; 1、点击左下角windows菜单&#xff1a; 2、直接输入要打开…

基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库

文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统&#xff0c;是基于 Java SpringBoot 开发的。主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。 &#xff08;1&#xff09;管…

在win系统安装部署svn服务及客户端使用

1. 安装svn服务端 1.1. 下载svn服务端 进入SVN服务端官网&#xff0c;并下载&#xff1a; 1.2. 下载后双击即可安装&#xff0c;选择下一步 1.3. 同意许可&#xff0c;选择下一步 1.4. 选择安装SVN的组件&#xff0c;默认&#xff0c;下一步 1.5. 设置安装路径、仓库路径、…

Python爬虫实战:用简单四步爬取小红书图片

小红书是一个热门的社交分享平台&#xff0c;汇聚了大量精美的图片。如果您希望保存或使用这些图片&#xff0c;本文将为您详细介绍如何使用Python爬虫轻松爬取小红书图片。 一、安装必要的库 在开始之前&#xff0c;确保您已经安装了以下Python库&#xff1a; requests&#…

http的get与post

get方法&#xff1a; 这个网址可以获取配置信息&#xff08;我把部分位置字符改了&#xff0c;现在打不开了&#xff0c;不然会被追责&#xff09; http://softapi.s103.cn/addons/Kmdsoft/Index/config?productwxdk&partner_id111122&osWindows&os_version11&am…

Nginx之QPS限制模块解读

目录 基本介绍 模块配置具体解读 limit_req_zone limit_req 原理&#xff1a;漏桶算法 基本介绍 NGINX通过limit_req_zone和limit_req两条指令来实现速率限制。指令limit_req_zone定义了限速的参数&#xff0c;指令limit_req在所在的location使能定义的速率。 QPS即每秒…