指针运算笔试题解析

题目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.mzph.cn/news/724985.shtml

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

相关文章

Freesia Spring配置文件与其他文件

common-api模块【application.yml文件】 project:version: 来自顶级pom.xml的properties配置 --- spring:profiles:# 根据当前活跃环境指定对应的 application文件active: profiles.active --- spring:datasource:driver-class-name: com.p6spy.engine.spy.P6SpyDriverurl: jd…

算法DFS 复习

思路:for 代表的是每一位的纵向,数字变化,dfs 代表的是横向的,位置变化。vis 来做到每个枚举的数不重复,并且要在搜索前记录,搜索后还原。模拟该样例 dfs3 的时候是输出,dfs0,1&…

『大模型笔记』Ollama ModelFile(模型文件)

Ollama ModelFile(模型文件) 文章目录 一. Ollama 模型文件1.1. 格式1.2. 示例1.2.1. 基本`Modelfile`1.2.1. `模型文件`位于 [ollama.com/library](https://ollama.com/library)1.3. 说明1.3.1. From(必填)1.3.1.1. 从 llama2 构建1.3.1.2. 从 `bin` 文件构建1.3.2. PARAMETER…

【DAY05 软考中级备考笔记】线性表,栈和队列,串数组矩阵和广义表

线性表,栈和队列,串数组矩阵和广义表 2月28日 – 天气:阴转晴 时隔好几天没有学习了,今天补上。明天发工资,开心😄 1. 线性表 1.1 线性表的结构 首先线性表的结构分为物理结构和逻辑结构 物理结构按照实…

【LabVIEW FPGA】CIC滤波器

一、CIC滤波器应用概述 在通信数字信号上下变频时,经常会用到对数字信号的升采样和降采样,即通过CIC数字速率器实现变采样率。 二、滤波器IP 首先设置滤波器基本参数(filter specification) 滤波器类型(Filter Type…

uipath调用js代码

1,调用js代码,不带参数,没有返回值 为了去掉按钮的disabled属性 function(){ document.getElementsByClassName(submitBtn)[0].removeAttribute(disabled); } 2,调用js代码,带参数,没有返回值 输入参数&a…

使用Go语言编写API接口的技术

在本篇技术性博客中,我们将讨论如何使用Go语言编写一个简单的API接口。我们将使用net/http包来处理HTTP请求和响应,并且通过JSON来传递数据。 步骤一:定义API响应结构体 首先,我们需要定义一个结构体来表示API的响应。在我们的示…

【conda】实现conda环境迁移的4种方式

文章目录 方案1: 使用conda pack制作压缩包并在目标环境解压使用方案2: 使用package列表文件重新创建conda环境方案3: scp将环境文件夹拷贝到目标主机上方案4: 通过--clone先克隆一个环境再conda pack打包迁移 方案1: 使用conda pack制作压缩包并在目标环境解压使用 适合离线环…

基于51单片机的四位并行数据主从机传输设计

基于51单片机的四位并行数据主从机传输设计[proteus仿真] 主从机通信系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的四位并行数据主从机传输设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文…

WPF调用webapi并展示数据(一):WPF页面的构建

有错误欢迎大家给我指正 本项目为WPFPrismnet6.0 RestSharp调用API UI为MaterialDesignThemes EF Core自动生成数据库 效果展示: 项目启动后点击待办事项进入数据展示页 源码地址:绎Ronion/WPF.ToDo (gitee.com) 1.准备 1.1创建WPF项目 1.2 创建…

解决划分标签问题的算法分析与实现

引言 在这篇博客中,我们将讨论一种解决划分标签问题的算法,该算法可以有效地将输入字符串划分为尽可能多的子串,使得每个字母最多出现在一个子串中。我们将通过代码实现和详细解释来展示这一算法的工作原理。 题目描述 给你一个字符串 s 。…

Axure 入门文档 文件格式 全局样式 元件居中

文件格式 .rp 原型文件.rplib:元件库文件.rpteam 团队项目文件.html 项目网页文件 批量设置居中 选中多个,然后上方任务栏即可设置 设置自定义页面视图尺寸 项目-自适应视图设置 点击页面空白处就可以使用 添加元件说明 当一个元件创建好,可以设…

[R] Underline your idea with ggplot2

Preview: # 介绍:之前的教程中,我们学习了如何使条形图或直方图看起来更好 比如: 1. How to select a graph calibrate the geom part 2. How to select variables calibrate the aes part 3. How to add a title calibrate the labs …

消除类游戏解题思路(ccf 201512-2)

问题描述   消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以…

指针乐园----上

大家好,我是Beilef,许久未见还请多多关照。 文章目录 目录 文章目录 前言 一、指针是什么 二、指针的运用 1.指针变量和地址 2.指针变量和解引⽤操作符(*) 解引用操作符 3.指针变量类型及意义 3.2指针的-整数 3.3 void* 指针 …

Android13 framework层添加关机接口

framework层修改: t0_sys/frameworks/base/core/api/current.txt method RequiresPermission(android.Manifest.permission.REBOOT) public void reboot(Nullable String);method public void rebootp();t0_sys/frameworks/base/core/java/android/os/IPowerManager…

docker-compose Install Dockge

Dockge Dockge 是一个精美的、易于使用的、反应式的自托管 docker compose.yaml 面向堆栈的管理器。 主要特性: 通过Web页面管理compose.yaml文件。 创建/编辑/启动/停止/重新启动/删除容器。更新Docker镜像。交互式Web终端。响应式设计,实时更新进度(Pull/Up/Down)和Web…

C++搜索二叉树的实现

搜索二叉树的实现 keykey-value测试用例 key namespace key{ template<class k> struct BSTreeNode {BSTreeNode<k>* _left;BSTreeNode<k>* _right;k _key;BSTreeNode(const k& key):_left(nullptr),_right(nullptr),_key(key){}};template <class k…

学习经验心得体会

学习经验心得体会 自从踏入学习的殿堂&#xff0c;我深知知识如同海洋&#xff0c;无边无际。多年的学习经历&#xff0c;使我积累了丰富的经验&#xff0c;也对学习有了更深入的理解。在此&#xff0c;我愿将我的学习经验心得体会分享给大家&#xff0c;希望能对正在探索知识…

01-Linux系统概述,安装网络和防火墙配置

Linux系统概述&#xff0c;安装网络和防火墙配置 unix概述 Unix 是在1969年美国贝尔实验室的 肯.汤普森开发出来的一款操作系统&#xff0c;什么是操作系统&#xff1f;大家正在玩的 Windows 和 Max OS就是两个操作系统。操作系统是用户和计算机的接口&#xff0c;同时也是计…