八大指针笔试题带你overcome指针

news2024/11/15 23:45:22

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将C语言基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《系统解析C语言》《算法详解》《C语言-语法篇》

内容分享:本期将用八大笔试题带你战胜指针,各位看官姥爷快搬好小板凳坐好叭。

    -------- 不要998,不要98,只要一键三连,三连买不了吃亏,买不了上当

前言

上期关于指针的文章,我们用多个试题对指针与数组的关系进行了全面多方位的讲解。这期文章我们将用八道经典的指针笔试题来全面多方位来了解指针。

第一题

答案是多少呢?为什么是这个答案呢?

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+1就是第二个元素的地址,解引用就是2。&a+1就是跳过整个数组,在5元素的后面,强制类型为int就意味着它后面地址加减的单位都是int类型。ptr就是&a+1的地址,所以ptr-1就是向前减一个int类型,就指向了5的地址,解引用就是5。

 

第二题

假设p 的值为0x100000。 如下表表达式的值分别为多少?
已知,结构体Test类型的变量大小是20个字节


struct Test
{
 int Num;
 char *pcName;
 short sDate;
 char cha[2];
 short sBa[4];
}*p;

int main()
{
 printf("%p\n", p + 0x1);
 printf("%p\n", (unsigned long)p + 0x1);
 printf("%p\n", (unsigned int*)p + 0x1);
 return 0;
}

分析

通过提示,我们知道他是一个结构体指针类型,大小为20个字节,地址为0x100000。0x1就是p+1就是加一个20大小的结构体类型,就是0x100000+20=0x100014。unsigned long p 就是将p转化为整型,整型加1就是加1.结果就是0x100000+1=0x100001 unsigned int* p就是将p转化为指针类型,所以p+1就是加了一个指针大小0x100000+4=0x100004

第三题

答案是多少?为什么是这样呢?

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

分析

a是首元素的地址,&a+1取出的是整个数组的地址 int*(&a+1)就是将&a+1的类型转化为int*的类型,ptr[-1]可以理解为*(ptr-1),ptr就是&a+1,所以ptr-1就是减一个int*类型大小,所以就在元素4的地址,解引用就是4 int a就是将地址a转化为整型,整型加1就是加1 ,我们又知道,在内存中一个地址就是一个字节,这里加1,所以a+1指向的内容就是00到02 0x02000000

第四题

答案是什么呢?为什么呢?

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

解析

通过观察:我们可以发现,a数组里面是(),所以是逗号表达式,保留右边的值,所以()里的值是1,2,3未满就补0,后面都是0,所以数组中布局就是画图后的样子。

p是a[0]的地址,而a[0]是代表的第一行,我们可以把a[0]理解为第一行的数组名,所以a[0]是首元素的地址,解引用就是1

第五题

答案是多少呢?为什么是这样呢?

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

  解析

a数组是一个五行五列的二维数组 a是起始元素的地址 将a的地址赋给p 且q是一个数组指针 p的类型是int[4]。
所以p每加一跳过4个元素 所以p[4]就相当于*(p+4) p的地址就是画图后的地址  两地址相减结果就是中间元素的个数 所以&p[4][2]-&a[4][2]=-4
我们知道电脑中存的都是补码
原码10000000000000000000000000000100
反码11111111111111111111111111111011
补码11111111111111111111111111111100
以%P打印就直接把补码当做地址打印了
以%d打印还是-4

 

第六题

答案是多少呢?为什么是这样呢?

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取出的是整个二维数组的地址
ptr1=&aa+1 &aa+1被转化为int*类型 所以ptr-1,就是减去一个int*类型大小,这时ptr指向10元素的地址,解引用为10

aa+1就是第一行的地址加1到第二行的地址,我们发现aa+1的类型也是int*,前面的int*就没用了。就可以理解为:int*ptr=*(aa+1),我们又可以把*(aa+1)理解为aa[1],aa[1]为第二行数组名,就是首元素地址,又因为ptr==*(aa+1)==aa[1],所以ptr-1就是指向元素5,解引用就是5

 

第七题

答案是多少呢?为什么是这样呢?

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

解析

我们要知道数组a里面存的char*类型的元素,是work,at,alibaba首元素的地址

用二级指针存放a的地址,pa==a,pa++==a++,a是首元素的地址,pa++==a++就是第二个元素的地址。

*pa就是at首字母的地址,%s就是通过首字符地址打印这一串字符

 

第八题

答案是多少呢?为什么是这样呢?

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数组存放的是字符串首元素的地址,cp数组存放的是这些首元素的地址的地址,cpp存放的是cp的地址。这里我们还要注意一个点:++和--是直接改变了它们的值,会影响后面的计算的。

 


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

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

相关文章

pgsql序列的使用

大家都知道pgsql和mysql不同&#xff0c;mysql字段有有自增属性&#xff0c;pgsql并没有&#xff0c;但是pgsql和oracle一样有序列&#xff0c;很多人刚接触pgsql的时候&#xff0c;并不知道序列是什么&#xff0c;怎么用&#xff0c;下面这篇文章就介绍序列&#xff0c;并且怎…

Flutter系列(十一)实现商城首页和商品详情页

基础工程&#xff1a; Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 一、前言 本文用flutter实现商城首页和商品详情页&#xff0c;效果如下图&#xff1a; 二、使用的组件 MasonryGridView.count 瀑布流插件&#xff…

几何引擎 约束求解器 3D仿真物理引擎 图形引擎

几何引擎 & 约束求解器 & 3D仿真物理引擎 & 图形引擎 1 介绍技术图谱建模主流CAD/CAM/CAE/AEC所用引擎 2 几何建模引擎2.1 介绍2.2 各家实现 3 图形引擎4 几何约束求解器4.1 介绍4.2 各家实现D-Cubed DCM&#xff08;西门子&#xff09;CGM(达索&#xff09;LGS&am…

OpenGL模型控制(旋转、平移)

1.效果图 2.平移 首先做一个鼠标双击事件&#xff0c;表示平移模型对象&#xff0c;当然&#xff0c;我们需要遍历当前哪个模型对象被选中&#xff0c;才能进行该对象的平移操作。 void AXBOpemglWidget::mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event);if(m_m…

团体程序设计天梯赛-练习集L1篇⑥

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

命令行编译C程序

目录 设置MSVC环境变量 C文件编译流程 编译 链接 学习起步之初&#xff0c;先用最基础的命令行工具进行学习 设置MSVC环境变量 这个是在VS2019下进行配置的&#xff0c;位置和你安装IDE的位置有关 MSVC D:\VS2019\IDE\VC\Tools\MSVC\14.29.30133WK10_INCLUDE C:\Program …

Android App安装弹窗显示流程

一、APP的安装 1、常见安装方式 系统应用和预制应用安装――开机时完成&#xff0c;没有安装界面&#xff0c;在PKMS的构造函数中完成安装 网络下载或第三方应用安装――调用PackageManager.installPackages()&#xff0c;有安装界面。 ADB工具安装――没有安装界面&#xf…

社交登陆成功回调

1. 点击跳转至第三方授权 2. 这是使用gitee作为第三方授权进行验证 3. 授权成功则跳转至 redirect_url 4. 社交登陆回调逻辑 一、根据第三方授权提供的方式获取token &#xff08;1&#xff09;发送请求获取code码&#xff08;每次发送请求&#xff0c;code码会改变&#xff…

构建安全架构的 Azure 云:深入了解零信任体系结构

文章目录 前言一、零信任安全模型的概念以及背景介绍二、传统安全模型&#xff08;边界模型&#xff09;三、零信任模型&#xff08;现阶段主流云厂商策略&#xff09;四、Azure 中的零信任体系结构&#xff08;本文重点&#xff09;4.1 基础知识点&#xff08;必须了解&#x…

File 类,InputStream, OutputStream 的用法

目录 一.File类 关于名字和路径的操作 关于创建和销毁的操作 创建文件夹(多级目录) InputStream 第一种:字节流读取 第二种: 字符流读取(Reader) OutputStream 第一种:字节流写入 第二种方式:字符流输入 一.File类 File翻译过来"文件" 那么File类的操作实际…

【初识 Docker | 中级篇】 Docker 安装 Redis

文章目录 前言一、安装 docker1、安装docker2、安装docker-compose 二、redis 单机安装1.创建配置文件1.1.创建目录1.2.创建redis.conf1.3.创建docker-compose.yml 2.启动redis容器 总结 前言 可以按照以下步骤在 Docker 中安装 Redis docker pull redis 拉取Redis镜像 docker…

CSS3-定位

网页常见布局方式 1 标准流 1 块级元素独占一行 → 垂直布局 2 行内元素/行内块元素一行显示多个 → 水平布局 2 浮动 可以让原本垂直布局的 块级元素变成水平布局 3 定位 1 可以让元素自由的摆放在网…

软件项目管理 第五章 软件项目的成本管理 课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第五章 软件项目的成本管理 课后习题参考答案 1.选择题 (1)&#xff08;A&#xff09;是用系统的功能数量来测量其规模,与实现产品所使用的语言和技术是没有关系的。 A.功能点 B.对象点 C.代码行 D.用例点 (2)如果你是某项目的项目经理,你已经估…

easyX库文字输出相关函数(注释版)

您好这里是limou3434的博文系列&#xff0c;感兴趣的话可以看看我的其他系列。 本次我给您带来的是easyX库的字符输出系列函数&#xff0c;祝您看得开心。 0.文字输出函数概览 函数或数据类型描述LOGFONT文字样式的结构体。settextcolor设置当前文字颜色。settextstyle设置当…

Altium Designer VS CADENCE 颜色配置

最近公司要求用CADENCE画图&#xff0c;对于我这个用了10年以上AD的老玩家来说&#xff0c;真的是很不想接受&#xff0c;虽然AD有版权问题&#xff0c;据说也容易收到律师函&#xff0c;但还是不想更换&#xff0c;毕竟用了10年了&#xff0c;感情、熟练程度摆在那里。没办法&…

继承的基本内容

在面向对象部分提到过&#xff0c;面向对象三大特性&#xff08;不是只有三个特性&#xff0c;而是指存在感最强的三个特性&#xff09;&#xff1a;封装&#xff0c;继承&#xff0c;多态。 封装&#xff1a;对比C语言&#xff0c;将数据和处理数据的方法放入一个类中&#xf…

【算法总结】——组合型回溯

文章目录 组合型回溯例题1——组合从输入考虑模板从答案考虑模板 例题2——括号生成解法一解法二 剪枝分析回溯时间复杂度的通用方法 组合型回溯 组合型和子集型之间的差异在哪里呢&#xff1f; 相比子集问题&#xff0c;组合问题是可以做一些额外的优化的&#xff08;因为只…

Linux模块文件编译到内核与独立编译成.ko文件的方法

很多粉丝在群里提问&#xff0c;如何把一个模块文件编译到内核中或者独立变异成ko文件。本文给大家详解讲解。 1. 内核目录 Linux内核源代码非常庞大&#xff0c;随着版本的发展不断增加。它使用目录树结构&#xff0c;并且使用Makefile组织配置、编译。 初次接触Linux内核&…

Visual Studio 2022写Windows程序造成CPU占用率过高故障排除

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天针对Visual Studio 2022写Windows程序造成CPU占用率过高故障进行排除。 下面是一个标准的Windows程序&#xff0c;也可以说是经典程序了&#xff0c;但是这个程序一运行&#xff0c;WinMain.exe的CPU占用…

Android 13(T) - binder阅读(2)- ServiceManager的启动与获取

1 ServiceManager的启动 1.1 服务的启动与注册 上一篇笔记中有说到&#xff0c;ServiceManager是一个特殊的binder service&#xff0c;所以它和普通的service一样需要打开binder驱动&#xff0c;在驱动中创建一个属于ServiceManager进程的binder_proc。 int main(int argc,…