指针运算笔试题解析

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

ptr中存放了整个数组的地址,ptr是int*类型,&a+1跳到5的地址后又被强制类型转换为int*类型。故ptr-1是减去四个字节,而不是减去整个数组的大小。

a数组名表示数组首元素地址,+1跳到第二个元素的地址。

题目2:

struct Test
{
    int Num;
    char* pcName;
    short sdate;
    char a[2];
    short sba[4];
}*p = (struct Test*)0x100000;

//这里p是指针
int main()
{
    printf("%p\n", p + 0x1);
    printf("%p\n", (unsigned long)p + 0x1);
    printf("%p\n", (unsigned int*)
    return 0;
}

printf("%p\n", p + 0x1);//结构体指针+1跳过一个结构体,Test的大小为20,即为0x100000+20 = 0x100014(16进制)
printf("%p\n", (unsigned long)p + 0x1);//强制类型转换成unsigned long,这里p不再认为是指针,而是看作成了一个整数,0x100001
printf("%p\n", (unsigned int*)p + 0x1);//强制类型转换成unsigned int*, +1跳过4个字节

另外这是在x86环境下输出的数据,x64环境下会有所不同(指针大小与结构体大小会发生改变)

题目3:

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

如果忽略了(),而把它当成{},结果自然是0

逗号表达式的求值规则是从左到右依次求值各个子表达式,最终整个表达式的值是最后一个子表达式的值。逗号表达式通常用在需要依次执行多个操作、但只关心最后一个操作结果的场景中。

因此数组a中存放的是{{1, 3}, {5, 0}, {0, 0}}

题目4:

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的类型是int(*)[5],而p是int(*)[4],故会发生越界,但还是能存储。

p一行是四个元素,p[4][2] 等同于a[3][3]

 &p[4][2] - &a[4][2] = -4(指针-指针得指针之间的元素个数),打印的是地址,故转变成补码形式,原码100000000000000000000000000000100,补码按位取反再加1,11111111111111111111111111111100四个1为一个F,1100是12就是C,地址不分原码和补码,故为

FFFFFFFC

题目5:

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+1跳过整个二维数组,即10的地址后,又(int*)(&aa + 1),强制类型转换。(ptr1 - 1)减去四个字节(1个int*),指向元素10。

aa数组名表示首元素地址,二维数组首元素是一维数组,故aa表示第一行一维数组地址,aa+1指向第二行一维数组地址*(aa+1)表示aa[1],(int*)(*(aa + 1))强制类型转换后,(ptr2 - 1)指向5。

题目 6:

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

指针数组:指针数组存储的是指针变量的集合。a数组中每个元素都是char*类型

pa指向"work",pa++指向"at",解引用后得at

题目7:

int main()
{
    char* c[] = { "ENTER","NEW", "POINT", "FITST" };
    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;
}

    printf("%s\n", **++cpp);//数组首元素+1,指向c+2 **后POINT

    printf("%s\n", *--*++cpp+3);//先++cpp此时cpp指向c+1,解引用后cp指向"NEW",--cp指向"ENTER",再解引用后指向字符串首元素地址,+3指向E,后打印ER

    printf("%s\n", *cpp[-2]+3);//*cpp[-2]可看作*(*(cpp - 2)),此时cpp指向c+1cpp-2指向c+3,**后指向字符串"FITST"首元素地址,+3,指向s,打印ST


    printf("%s\n", cpp[-1][-1]+1);//可看作*(*(cpp - 1) - 1) + 1,cpp指向c+1未变,cpp-1指向c+2,*后-1指向"NEW",再*后,指向首元素地址+1,打印EW

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型:使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数:peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

【打工日常】使用docker部署在线Photopea用于linux下替代ps

一、Photopea介绍 linux没有ps适配,对于有时候工作来说确实不方便,我找了很久,才找到了一款功能可以跟ps接近的在线软件,使用docker部署就可以了。它是ps的最佳替代品之一,其界面几乎与ps相同,只不过它是在…

MySQL基础-----SQL语句之DCL数据控制语句

目录 前言 一、管理用户 1.查询用户 2.创建用户 3.修改用户密码 4.删除用户 案例 二、权限控制 1.查询权限 2.授予权限 3.撤销权限 案例 前言 本期我们学习SQL语句的最后一部分内容,也就是数据控制语句DCL。DCL英文全称是Data Control Language(数据控制语…

鱼哥赠书活动第12期:《基于React低代码平台开发》

鱼哥赠书活动第12期:《基于React低代码平台开发》 一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望内容简介:作者简介如何阅读:适合阅读人群:赠书抽奖规则:往期…

DMA 链表模式(LLI)深度解析

在进行一次 DMA 读或者写的时候,可以配置多个链表,从而当一个链表的数据传输完成时,会跳到下一个链表的起始地址,并继续传输数据,直到链表的下一个地址为 0。如果 DMA 使能了完成中断,则当 DMA 发送或者接收…

15 实战:Kaggle房价预测 + 课程竞赛:加州2020年房价预测【李沐动手学深度学习课程笔记】

15 实战:Kaggle房价预测 课程竞赛:加州2020年房价预测【李沐动手学深度学习课程笔记】https://zhuanlan.zhihu.com/p/685343754 写在前面:这里格式很乱,代码直接去知乎copy 1 实战Kaggle比赛:预测房价 1.1 实现几个函…

【源码】imx6ull实现触摸屏单点实验-移植tslib和qt

一、本实验实验的器材: 1.正点原子imx6ull的阿尔法开发板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、实验已经移植好的文件: 仓库代码:https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件说明 arm-qt.tar.bz2:移植好的…

基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,…

Mint_21.3 drawing-area和goocanvas的FB笔记(四)

Cairo图形输出 cairo的surface可以是pixbuf, 可以是screen, 可以是png图,也可以是pdf文件 、svg文件、ps文件,定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图,如果surface是p…

Linux基本命令

一、基本命令 修改mysql端口号 vim /etc/my.cnf云服务器ssh端口修改 vim /etc/ssh/sshd_config1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启1.2…

使用mysqld --install命令时出现MSVCR120.dll文件丢失错误

Visual C 2013 and Visual C Redistributable Package https://support.microsoft.com/en-us/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package 进去之后先找到自己的版本,x64还是x86,下载 vcredit ,进行安装即…

小程序固定头部:CSS实现

效果图 代码逻辑:设置头部的高度,浮动固定后,再加个这个高度的大小的外边距 .weui-navigation-bar {position: fixed;top: 0px;left: 0px;right: 0px;height:90px; } .weui-navigation-bar_bottom{height:90px; }

高转化利器】Xinstall实现H5唤醒App,打开指定页面,轻松满足营销需求!

在移动互联网时代,App的拉新促活对于企业的发展至关重要。为了提升用户体验和转化率,Xinstall推出了一项强大的功能——H5唤醒App。通过这一功能,用户可以直接从Web页面拉起App,并在拉起过程中通过传参打开指定页面,满…

【Vue3】Hooks:一种全新的组件逻辑组织方式

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

MATLAB环境下基于离散小波变换的体外血管图像处理

下面简要介绍小波变换的部分应用。 信号去噪。小波去噪是根据有效信号和噪声信号在小波变换后表现出的不同特性实现的,一般可用于去除语音、图像、视频等中的噪声信号。小波去噪方法根据对小波系数的非线性处理方式分为三类,分别是小波变换模极大值去噪…

qt QRadioButton 及QButtonGroup 使用

QRadioButton 放在组合框QGroupBox中,再点击时,即使有多个QRadioButton按钮,同时选中的也就只有一个。 如下图所示, 对于多个QRadioButton,每个按钮都写一个槽函数是不太明智的选择,需要将QRadioButton放在…

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

excel导出标准化

虽然标题叫标准化,只不过是我自己的习惯,当一件事情变得流程标准化之后,开发程序就会飞快,开发评估工作总是 搞个1~2天,实则前端后端一起开发,1个小时就可以搞定。 1 前端 const exportXls async () >…

Hadoop配置日志的聚集——jobhistory不显示任务问题

问题: 一开始job history是正常的,配置了日志的聚集以后不管做什么任务都不显示任务,hdfs是正常运行,而且根据配置步骤都重启过了。 下面先po出日志聚集的操作步骤,再讲问题 1.配置yarn-site.xml cd $HADOOP_HOME/e…

常见的几种echarts类型

一:折线图 let option {tooltip: {},animation: false,grid: {top: "20%",bottom: "33%", //也可设置left和right设置距离来控制图表的大小left: 5%,right: 5%},xAxis: {boundaryGap:false,data: [1,2,3,4,5],axisLine: {show: true, //隐藏X轴…