指针笔试题讲解

news2024/11/18 9:44:37

文章目录

  • 题目
  • 答案与解析
    • 1、
    • 2
    • 3
    • 4、
    • 5、
    • 6、
    • 7、
    • 8、


题目

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}
//由于还没学习结构体,这里告知结构体的大小是20个字节
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
    int Num;
    char* pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
    p = (struct Test*)0X100000;
    printf("%p\n", p + 0x1);//
    printf("%p\n", (unsigned long)p + 0x1);
    printf("%p\n", (unsigned int*)p + 0x1);
    return 0;
}
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;
}
int main()
{
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int *p;
    p = a[0];
    printf( "%d", p[0]);
 return 0;
}
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;
}
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;
}
int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);
 return 0;
}
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;
}

答案与解析

重点知识点:
数组名在大多数情况下表示数组首元素的地址,但是两种情况除外
(1)sizeof(数组名),这时表示整个数组的大小
(2)&数组名,这时表示整个数组的地址

1、

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

解析:

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int* ptr = (int*)(&a + 1);//&a,取出的是整个数组的地址,加一,跳过整个数组的大小
    printf("%d,%d", *(a + 1), *(ptr - 1));//这里两个都是int*类型的指针,且都是普通的加减一,都只跳过4个字节
    return 0;
}

在这里插入图片描述

2

答案:

解析:

int main()
{
    p = (struct Test*)0X100000;
    //这里的p是结构体指针,加一跳过一个结构体大小的字节,跳过20个字节,由于是16进制,所以显示14
    printf("%p\n", p + 0x1);
    //这里将p强制转化为了unsigned long类型,非指针,加一就只是加1个字节
    printf("%p\n", (unsigned long)p + 0x1);
    //这里将p强制转化为了unsigned int* 类型,加一跳过一个Int类型的大小,4个字节
    printf("%p\n", (unsigned int*)p + 0x1);
    return 0;
}

3

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

解析:

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    //&a 取出的是整个数组的地址,加1跳过整个数组的大小(4 * 5 =20个字节)
    int* ptr1 = (int*)(&a + 1);
    //将p转化为Int 类型,加一就只会跳过一个字节
    int* ptr2 = (int*)((int)a + 1);
    printf("%x,%x", ptr1[-1], *ptr2);
    return 0;
}

在这里插入图片描述

4、

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

解析:

int main()
{
    //下面数组中的元素有逗号表达式:例:(0,1),这样只会取到1的值,所以数组元素是(1,3,5)
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int* p;
    //a[0]是二维数组第一行的数组名,其内有1,3 两个元素
    p = a[0];
    //p[0] = 1
    printf("%d", p[0]);
    return 0;
}

5、

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

解析:

int main()
{
    int a[5][5];
    //数组指针类型
    int(*p)[4];
    //类型不一样,但是也可以存储,只是每次存储4个值
    p = a;
    //&p[4][2]-&a[4][2] = -4;将地址转化为16进制
    printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

在这里插入图片描述

6、

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

解析:

int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    //&aa 是取整个数组的地址,加1跳过整个数组
    int* ptr1 = (int*)(&aa + 1);
    //aa 代表二维数组第一行的值,加1跳过5个元素
    int* ptr2 = (int*)(*(aa + 1));
    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

7、

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

解析:

int main()
{
	//是一个指针数组,存储的是美格字符串的首元素一直
	char* a[] = { "work","at","alibaba" };
	//二级指针来保存a的地址
	char** pa = a;
	//正常的加1,跳过一个元素
	pa++;
	printf("%s\n", *pa);
	return 0;
}

8、

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

解析:
解析:

  1. c[]中存放的数据是每个字符串的首元素
  2. cp[]中存放的数据其实就是c中的反过来
  3. 对1:++cpp执行,指向c+2,解引用,得到c+2,再解引用得到了P的地址,打印出point
  4. 加号的优先级很低,先算其他的;打印的时候会把获得地址到\0之间的地址都打印
  5. 对2:++cpp执行,指向c+1,解应用得到C+1,指向N,–执行,指向E,解引用,得到E的地址,在加3,向后移3未,得到的是ENETR中第二个E的地址
  6. cpp已经经过了两次++,cpp[-2]得到得是跳转到C+3,得到F的地址,在进行解引用,跳到FIRST地址中,+3得到S的地址
  7. 对4:cpp还是指向c+1,cpp[-1]跳转到C+2,指向P,cpp[-1][-1]跳转到P的上一个NEW中,对其+1,得到E的地址
    在这里插入图片描述

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

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

相关文章

解答嵌入式和单片机的关系

嵌入式系统是一种特殊的计算机系统,用于特定任务或功能。而单片机则是嵌入式系统的核心部件之一,是一种在单个芯片上集成了处理器、内存、输入输出接口等功能的微控制器。刚刚好我这里有一套单片机保姆式教学,里面有编程教学、问题讲解、语言…

试图一文彻底讲清 “精准测试”

在软件测试中,我们常常碰到两个基本问题(困难): 很难保障无漏测:我们做了大量测试,但不清楚测得怎样,对软件上线后会不会出问题,没有信心; 选择待执行的测试用例&#…

百胜中国,全面进击

“未来三年,每年净增约1800家新店。” 美股研究社关注到,2023年投资者日活动上,百胜中国根据2024至2026年的发展规划,启动了集团RGM2.0战略。 三年时间,门店数要达到20000家,平均每年新增门店约1800家&am…

【【萌新的SOC大学习之hello_world】】

萌新的SOC大学习之hello_world zynq本次hello world 实验需要 PS-PL Configuration 页面能够配置 PS-PL 接口,包括 AXI、HP 和 ACP 总线接口。 Peripheral IO Pins 页面可以为不同的 I/O 外设选择 MIO/EMIO 配置。 MIO Configuration 页面可以为不同的 I/O 外设具…

蓝牙核心规范(V5.4)11.2-LE Audio 笔记之LE Auido架构

专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!&#x…

event.stopPropagation()

现在有如下 当点击子按钮的时候会触发子事件,同时也会触发父事件, 如何阻止呢 handleDownload(event) { event.stopPropagation(); 。。。。。。。。。。 },

积跬步致千里 || 可视化动图展示

可视化动图展示 目前只能在 jupyter notebook 中测试成功 %matplotlib notebook import numpy as np import matplotlib.pyplot as plt import timen 500 data np.random.normal(0,1,n)fig plt.figure() ax fig.add_subplot(111)fig.show() fig.canvas.draw()for i in ra…

【新版】系统架构设计师 - 案例分析 - 信息安全

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 信息安全安全架构安全模型分类BLP模型Biba模型Chinese Wall模型 信息安全整体架构设计WPDRRC模型各模型安全防范功能 网络安全体系架构设计开放系统互联安全体系结构安全服务与安全机制…

LRU、LFU 内存淘汰算法的设计与实现

1、背景介绍 LRU、LFU都是内存管理淘汰算法,内存管理是计算机技术中重要的一环,也是多数操作系统中必备的模块。应用场景:假设 给定你一定内存空间,需要你维护一些缓存数据,LRU、LFU就是在内存已经满了的情况下&#…

go语言 rune 类型

ASCII 码只需要 7 bit 就能完整地表示,但只能表示英文字母在内的 128 个字符,为了表示世界上大部分的文字系统,发明了 Unicode ,它是 ASCII 的超集,包含世界上书写系统中存在的所有字符,并且为每个代码分配…

排队工会模式:电商营销的新趋势,让你的平台月流水过亿

排队工会模式是一种新型的电商营销模式,它利用产品利润分红的方式来吸引用户购买和推广,从而实现平台的流量和销量的增长。这种模式的核心是建立一个分红池,平台从每个产品的利润中拿出一定比例来充值分红池,然后按照用户的购买顺…

【yolov5】原理

Focus操作 anchors 先验框 其它 Yolov5的模型主要由Backbone、Neck和Head三部分组成。 Backbone:负责提取输入图像的特征。在Yolov5中,常见的Backbone网络包括CSPDarknet53或ResNet。这些网络都是相对轻量级的,能够在保证较高检测精度的同…

前端项目练习(练习-005-webpack-03)

学习前,首先,创建一个web-005项目,内容和web-004一样。(注意将package.json中的name改为web-005) 前面的代码中,打包工作已经基本完成了,下面开始在本地启动项目。这里需要用到webpack-dev-serv…

如何通过Gunicorn和Niginx部署Django

本文主要介绍如何配置Niginx加载Django的静态资源文件,也就是Static 1、首先需要将Django项目中的Settings.py 文件中的两个参数做以下设置: STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static) 然后在宝塔面板中执行python manage.…

Simulink仿真模块 - Digital Clock

Digital Clock:以指定的采样间隔输出仿真时间 在仿真库中的位置为:Simulink / Sources 模型为: 说明 Digital Clock 模块仅以指定的采样间隔输出仿真时间。在其他时间,此模块保留输出的上一个值。要控制此模块的精度,请使用模块对话框中的 Sample time 参数。 当需要离散系…

S09-录入的数据快速分列

选中某一列数据,数据-》分列 确定分隔符

孜然单授权系统V1.0[免费使用]

您还在为授权系统用哪家而发愁?孜然单授权系统为您解决苦恼,本系统永久免费。 是的,还是那个孜然,消失了一年不是跑路了是没有空,但是这些都是无关紧要的,为大家带来的孜然单授权系统至上我最高的诚意&…

论文研究有哪些方法?

在写论文的的时候,选择合适的研究方法至关重要。好的研究方法会增加你论文的可信度和更具有科学性,为你的研究成果增添色彩。下面将介绍几种常用的研究方法,供大家参考学习。 1.文献综述法 多用于理论研究类论文写作。文献综述法是对某一领域…

微信小程序:uniapp解决上传小程序体积过大的问题

概述 在昨天的工作中遇到了一个微信小程序上传代码过大的情况,在这里总结一下具体的解决步骤,首先介绍一下,技术栈是使用uniapp框架HBuilderX的开发环境。 错误提示 真机调试,提示包提交过大,不能正常生成二维码&…

为什么PDF打开没有密码,但是不能编辑?

PDF文件在PDF编辑器中打开之后应该是可以直接编辑了的,打开PDF文件的时候没有提出要输入密码,可是进入文件后,不能编辑,比如下图: 提示文件受到限制,无法编辑。这就是因为设置了限制编辑。我们将限制取消就…