C进阶:征服指针之指针笔试题强化(3)

news2024/9/24 17:08:28

目录

                        ​​​​​​​        🐲T1.

                ​​​​​​​        ​​​​​​​       🤖 T2.

                ​​​​​​​        ​​​​​​​       🐬 T3.

                ​​​​​​​        ​​​​​​​        🐳 T4.

                ​​​​​​​        ​​​​​​​        ​​​​​​​  🕊️ T5.

                ​​​​​​​        ​​​​​​​      🦞  T6.

                ​​​​​​​        ​​​​​​​       🐿️ T7.

                ​​​​​​​        ​​​​​​​        ​​​​​​​🪶  T8.


T1.

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+1):数组名表示数组首元素的地址,+1 就是数组下标为1的元素的地址,解引用就找到了这个元素;

 *(ptr-1):&a 取出的是整个数组的地址,+1 后跳过一个数组,然后将它强制类型转换成 int * 类型的,所以 ptr 是 int * 类型的指针,指针的类型即指针的步长,所以 ptr -1 减去4个字节,找到了数组的最后一个元素,详情如图:

 答案:2,5


T2.

这里告知结构体的大小是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);
 printf("%p\n", (unsigned long)p + 0x1);
 printf("%p\n", (unsigned int*)p + 0x1);
 return 0;
}

注意这题p的值是16进制的表达形式;

0x1 换算成十进制就是1,p是指针,加1加的是1个步长,题目中一告知结构体的大小是20个字节,所以 p + 0x1 =0x100000 +20 =0x100014 (注意换算成16进制的形式);

( unsigned long ) p 是把p 强制转换成 无符号长整形 ,所以这次加1,就是 +1,所以:

(unsigned long)p +0x1=0x100000 +1=0x100001;

 (unsigned int*)p 是把p强制转换成 无符号的 int * 类型 ,所以这次加1 ,加的是4,所以:

(unsigned int *)p+0x1=0x100000+4=0x100004;

答案:0x100014

          0x100001

          0x100004


T3.

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

这题的类型和 T1 差不多;

ptr[-1]:(int*)(&a+1) 的意思已在 T1 指出,ptr[-1]=*(ptr-1),还是这个图:

*ptr2 :(int)a+1 表示将a强制转换成 int 类型的,具体看图:


 T4.

#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[0] 表示的是第一行的一维数组的数组名,数组名表示首元素的地址,所以p[0] 的值为1(不要忽略逗号表达式);

答案:1


T5.

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

 

 答案:FFFFFFFC,-4

32位机器打印结果:


T6.

​
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

T7.

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

 看到 "alibaba",应该就知道这题曾经是阿里巴巴的笔试题了;

a 是一个指针数组,其中存放了3个 char* 类型的元素,所以要使用 a 的地址,应需要一个二级指针,详情如上图;

答案:at

T8.

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);
 return 0;
}

这题是最有难度的一题了,遇到这种题目先不要慌,画图是最好的解决方法;

原始图:

 第一个 printf :请看黄色箭头:

 注意现在的 cpp 指向的是 c+2;

第二个 printf :请看黑色箭头:

 第三个 printf :

*cpp[-2] 可以写成 **(cpp-2), 具体请看紫色箭头:

答案:POINT

           ER

           ST

打印结果:


🙂😀关于指针的题目到此就全部结束了,如有错误或是建议,欢迎小伙伴们提出;

🥰🤩如果认为本文还不错的话,不要忘了支持博主哦;

😆😁你们的支持是我更新的最大动力;

😸🐱谢谢你的阅读; 

 

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

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

相关文章

并发编程——5.共享模型之无锁

目录5.共享模型之无锁5.1.问题提出5.1.1.案例5.1.2.解决思路——锁5.1.3.解决思路——无锁5.2.CAS 与 volatile5.2.1.CAS5.2.2.volatile5.2.3.为什么无锁效率高5.2.4.CAS 的特点5.3.原子整数5.4.原子引用5.4.1.概述5.4.2.案例5.4.3.ABA 问题及解决5.5.原子数组5.6.字段更新器5.…

数位统计DP

目录 算法简介 算法讲解 数字计数 数位统计DP的递推实现 数位统计DP的记忆化搜索实现 算法实践 一 Windy数 二 手机号码 附录&#xff1a; 算法简介 数位统计 DP 用于数字的数位统计,是一种比较简单的 DP 套路题。 一个数字的数位有个位、十位、百位,等等,如果题目和…

Python3入门基础(03)数据结构

Python3 数据结构 Python3 中有四种标准的数据结构&#xff1a; List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#xff09; Python 3 的六个标准数据类型中&#xff1a; 不可变数据&…

MATLAB算法实战应用案例精讲-【人工智能】语义分割

前言 语义分割是一种典型的计算机视觉问题,其涉及将一些原始数据(例如,平面图像)作为输入并将它们转换为具有突出显示的感兴趣区域的掩模。许多人使用术语全像素语义分割(full-pixel semantic segmentation),其中图像中的每个像素根据其所属的感兴趣对象被分配类别ID。…

跟领导提离职了,现在后悔,想留下来,怎么办?

提完离职后悔了&#xff0c;怎么办&#xff1f;是坚持不变&#xff0c;继续离开&#xff1f;还是厚着脸皮留下来&#xff1f;有些网友支持楼主留下&#xff0c;让他舔回去。有人说&#xff0c;等领导挽留&#xff0c;哪怕是做个样子&#xff0c;就同意留下来&#xff0c;如果完…

第9章 前端调用POST-Api注意事项

1 “ has been blocked by CORS policy: Response to preflight request doesnt pass access control check: It does not have HTTP ok status.”。异常 1.1 通过跨域策略解决 1.1.1 在appsettings.json文件中定义跨域策略配置 // 跨域(Cors)配置的域名及其端口集&#xff0…

央视春晚彩排的关键时刻,主持人朱军终于回归了

盼望着、盼望着&#xff0c;春节临近了&#xff0c;春晚的零点钟声即将开始敲响了。一年一度的央视春晚&#xff0c;已经开启了第一次彩排&#xff0c;众多明星都参与其中&#xff0c;看来今年的春晚要热闹了。 虽然只是第一次彩排&#xff0c;但是很多明星艺人都已经亮相&…

Colyseus:轻量级多人游戏免费开源解决方案

点击上方“青年码农”关注回复“源码”可获取各种资料Colyseus 是一个独特的多人游戏框架&#xff0c;被用于许多 H5 小游戏和手机游戏中&#xff0c;使用容易&#xff0c;且选项众多&#xff0c;可满足开发者多样化的需求。如果你在制作多人联网游戏时遇到过各种扩展性需求和细…

数据卷(Data Volumes)

目录 1.Docker宿主机和容器之间文件拷贝 利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 2.数据卷 3.数据卷容器 1.Docker宿主机和容器之间文件拷贝 利用MySQL镜像安装MySQL服务 docker run -p 3307:3306 --name mysql2 -di -v /home/…

Qt中用thrift验证flume

一.flume简介 flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。 在flume中分为了3个组件&#xff0c;分别为source&#xff0c;channel和sink。 Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种…

在阿里做了7年软件测试原来是........

你了解软件测试岗吗&#xff1f; 很多人做测试3&#xff0c;5年&#xff0c;甚至年限多长。 但并不懂软件测试岗所要求的技术和能力&#xff0c;只是拘于当前的工作环境和培训班的宣传。 在一个微信里中看到如下的对话&#xff1a; 某人说&#xff0c;工作中开始做自动化了。…

8253练习题(8253端口地址怎么求?怎么求初值?怎么看出工作方式)

目录 一&#xff1a;简单&#xff08;题目把计数初值和工作方式都给你了&#xff09; 二&#xff1a;给了你输入时间周期和初值&#xff0c;你会不会求输出&#xff1f; 三&#xff1a;简单 四&#xff1a;初值计数方式都不给&#xff0c;初值还是给的时间和频率混合 五&a…

前端_swapCache方法 发布文章

swapCache方法 swapCache方法用来手工执行本地缓存的更新&#xff0c;它只能在applicationCache对象的updateReady事件被触发时调用&#xff0c;updateReady事件只有服务器上的manifest文件被更新&#xff0c;并且把manifest文件中所要求的资源文件下载到本地后触发。顾名思义…

[极客大挑战 2019]Secret File(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具: fiddler或burpsuite抓包 解题过程: 又是要找秘密&#xff0c; 先检查一下源代码 发现了一个链接与背景颜色融合了 点进去看看 找到了SECRET但肯定没这么简单 点击SECRET页面发生…

15. 我是怎么用一个特殊 Cookie ,限制住别人的爬虫的

爬虫训练场&#xff0c;第15篇博客。 博客详细清单&#xff0c;参考 https://pachong.vip/blog 本次案例&#xff0c;用定值 Cookie 实现反爬 文章目录Cookie 生成Python Flask 框架生成 CookieFlask make_response 加载模板Flask 判断指定 cookie 是否存在补充知识点Cookie 生…

【AcWing每日一题】4818. 奶牛大学

Farmer John 计划为奶牛们新开办一所大学&#xff01; 有 N 头奶牛可能会入学。 每头奶牛最多愿意支付 ci 的学费。 Farmer John 可以设定所有奶牛入学需要支付的学费。 如果这笔学费大于一头奶牛愿意支付的最高金额&#xff0c;那么这头奶牛就不会入学。 Farmer John 想赚…

C++ New和Delete

目录 前言 New Delete 前言 new是c中用于动态申请空间的运算符&#xff0c;malloc也是用于动态申请空间的&#xff0c;但malloc是函数。 New new是用来开辟一段新空间的&#xff0c;和一般申明不同的是&#xff0c;new开辟的新空间是在堆上&#xff0c;而申明的变量是在栈上…

【自学Java】Java注释

Java注释 Java注释教程 用于注解说明解释程序的文字就是注释&#xff0c;注释可以提高代码的阅读性。同时&#xff0c;注释也是一个程序员必须要具有的良好的编程习惯。我们首先应该将自己的思想通过注释先整理出来&#xff0c;再用代码实现。 在 Java 语言 中&#xff0c;一…

(二)Qt多线程实现海康工业相机图像实时采集

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a; &#xff08;一&#xff09;QtOpenCV调用海康工业相机SDK示例开发 第二章&#xff1a; &#xff08;二&#xff09;Qt多线程实现海康工业相机图像实时采集 文章目录系列文章目录前言一、项目…

C语言中指针常见问题集

1. 我想声明一个指针并为它分配一些空间,但却不行。这些代码有什么问题&#xff1f; char *p; *p malloc(10);答&#xff1a;你所声明的指针是p, 而不是*p, 当你操作指针本身时你只需要使用指针的名字即可:cp malloc(10);当你操作指针指向的内存时,你才需要使用*作为间接操…