当前位置: 首页 > news >正文

E31.【C语言】练习:指针运算习题集(上)

Exercise 1

求下列代码的运行结果

#include <stdio.h>
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);printf("%d",*(ptr - 1));return 0;
}

答案速查:

分析:

Exercise 2

 求下列代码的运行结果

//在x86环境下
//假设结构体的大小是20个字节
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

答案速查:

分析:

☑ printf("%p\n", p + 0x1);

出现单个p,代表结构体中首元素的地址,类比&数组名,+0x1跳过整个结构体

十进制20=0x14

即0x100000+0x14==0x100014,x86环境下输出结果为00100014

☑ printf("%p\n", (unsigned long)p + 0x1);

 p被强制类型转换为unsigned long,p不再是struct Test*指针类型(不考虑+0x1跳过整个结构体)即0x100000+0x1=0x100001,x86环境下输出结果为00100011

☑ printf("%p\n", (unsigned int*)p + 0x1);

p被强制类型转换为unsigned long*指针类型,之前讲过,指针+1表示跳过4个字节,即

0x100000+4==0x100004,x86环境下输出结果为00100004

Exercise 3(易错)

求下列代码的运行结果

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

答案速查:

分析:

错误思路:

认为二维数组的元素排布是这样的:

在13.5.【C语言】二维数组里讲过:只有这样写int a[3][2] = { {0, 1}, {2, 3}, {4, 5} };内部是大括号不是圆括号)才是上方的排布!

写成这样int a[3][2] = { (0, 1), (2, 3), (4, 5) };内含逗号表达式

在15.【C语言】初识操作符 下里讲过

exp1,exp2,exp3,……,expn

程序从左向右依次执行exp

整个exp的结果是最后一个exp的结果

所以变成int a[3][2] = { 1, 3, 5 };

画成图是这样的:

回看代码:p[0]即a[0][0],所以输出1

Exercise 4

 求下列代码的运行结果

#include <stdio.h>
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* ptr1 = (int*)(&aa + 1);

\

"&数组名"取的是整个数组的地址,+1跳过整个数组,在*(ptr1-1)又往回4个字节,解引用是10

*(aa+1)相当于aa[1],二维数组的一行就是一维数组,aa代表第一行的地址,+1转到第二行的6,输出*(ptr2-1)解引用是5

结果为10,5

★Exercise 5:指针-指针

求下列代码的运行结果

//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
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;
}

答案速查:

分析:

分析上方代码前先回顾下数组和指针

#include <stdio.h>
int main()
{int arr1[5] = { 1,2,3,4,5 };int* p1 = &arr1;int arr2[5]={ 0 };int *p2[5] = &arr2;int arr3[5]={ 0 };int (*p3)[5] = &arr3;int arr4[5]={ 0 };int* (*p4)[5] = &arr4;return 0;
}

上方代码运行是否有错误?写的是否规范呢?

逐条分析:

int arr1[5] = { 1,2,3,4,5 };定义了一个名为arr1的数组,其类型为int[5]

int* p1 = &arr1;&arr1的类型在int[5]的基础上加个*,即int[5]

这里int[5]int[5]类型不匹配

因此编译器会报警告:

必须强制让*与p1结合,建议改成:

int (*p1)[5] = &arr1;//p1是int(*)[5],指向含五个整型元素的数组

int arr2[5] = { 1,2,3,4,5 };定义了一个名为arr2的数组,其类型为int[5]

int *p2[5] = &arr2;出现了严重的问题!!

报错:

编译器认为p2是数组其包含5个元素(p2[5]),数组的类型为int*

&arr2的类型为int(*)[5]

这里int*int(*)[5]类型不匹配

必须强制让*与p2结合,建议改成:

int (*p2)[5] = &arr2;//p2是int(*)[5],指向含五个整型元素的数组

int arr3[5]={ 0 };int (*p3)[5] = &arr3;写法无误,解释同上


int arr4[5] = { 0 };定义了一个名为arr4的数组,其类型为int[5]

int* (*p4)[5] = &arr4;但p4类型有问题

arr4类型为int[5]

&arr4类型为int(*)[5]

但p4类型为int* (*)[5] 意思是p4是指向含5个int*类型指针元素的数组的指针

所以int(*)[5]int* (*)[5] 类型不匹配

因此编译器会报警告:

建议改成:

int* arr4[5] = { 0 };
int* (*p4)[5] = &arr4;

回到本练习:

a的类型为int[5][5],p的类型为int(*)[4],两者类型不一样,p=a;会发生类型的转换

因此会报警告

二维数组在内存中的排布(图中一个格子代表一个元素)可以按两种形式理解:p形式和a形式

对于p[4][2]:由于p是int(*)[4]类型,p+1代表跳过二维数组(这里p形式的二维数组是每4个元素一行因为int(*)[4])的第一行至第二行,因此p[4][2]即第4行(从第0行开始算)中的第2个元素

对于a[4][2]:由于a是int[5][5]类型,因此是第4行(从第0行开始算)中的第2个元素(这里a形式的二维数组是每5个元素一行)

指针-指针是两个指针之间的元素个数,%p以补码形式打印,%d以原码形式打印

&p[4][2] - &a[4][2]==小-大==负数,所以为-4(原码)-->FFFFFFFC(补码)

结果:FFFFFFFC,-4

相关文章:

E31.【C语言】练习:指针运算习题集(上)

Exercise 1 求下列代码的运行结果 #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d",*(ptr - 1));return 0; } 答案速查: 分析&#xff1a; Exercise 2 求下列代码的运行结果 //在x86环境下 //假设结…...

git分支的管理

分支管理是 Git 版本控制系统中的一个核心功能&#xff0c;它涉及如何创建、管理、合并和删除分支&#xff0c;以便在团队协作和开发过程中更有效地组织代码。以下是分支管理中的一些关键概念和实践&#xff1a; 1. 分支的创建 创建新分支&#xff1a;在开发新功能、修复 bug…...

对于消息队列的一些思考

如何保证消息不被重复消费 唯一ID&#xff1a;你提到的通过唯一ID解决重复消费问题非常重要。这通常通过业务系统引入唯一消息ID&#xff08;如UUID&#xff09;来实现。在消费端&#xff0c;先检查消息ID是否已经被处理&#xff0c;未处理过的才进行处理&#xff0c;确保幂等…...

IM即时通讯软件-WorkPlus私有化部署的局域网即时通讯工具

随着企业对通讯安全和数据掌控的需求不断增加&#xff0c;许多企业开始选择私有化部署的即时通讯工具&#xff0c;以在内部局域网环境中实现安全、高效的沟通与协作。IM-WorkPlus作为一款受欢迎的即时通讯软件&#xff0c;提供了私有化部署的选项&#xff0c;使企业能够在自己的…...

AI大模型的饕餮盛宴,系统学习大模型技术,你想要的书都在这里了

AI大模型的饕餮盛宴&#xff0c;系统学习大模型技术&#xff0c;你想要的书都在这里了 要说现在最热门的技术&#xff0c;可谓非大模型莫属&#xff01;不少小伙伴都想要学习大模型技术&#xff0c;转战AI领域&#xff0c;以适应未来的大趋势&#xff0c;寻求更有前景的发展~~…...

支付宝开放平台-开发者社区——AI 日报「9 月 9 日」

1 离开 OpenAl 后&#xff0c;llya 拿了10亿美金对抗 Al 作恶 极窖公园 丨阅读原文 lya Sutskever, OpenAl的前联合创始人&#xff0c;成立了SS1 (Safe Superintelligence)&#xff0c;旨在构建安全的Al模型。SSl获得了10亿美元的融资&#xff0c;估值达到50亿美元&#xff…...

将AI与情境定位结合以确保品牌安全

你可能会看到一些广告&#xff0c;感觉它们跟你在线阅读或观看的内容有奇怪的关联。这就是上下文广告在起作用。这种基于广告的解决方案在不断变化的数字环境中逐步发展&#xff0c;已经成为每个广告主的必备工具。不过&#xff0c;这种广告不只是把广告和上下文进行匹配这么简…...

OpenAI 联合 SWE 发布 AI 软件工程能力测试集,Gru.ai 荣登榜首

在 9 月 3 日&#xff0c;Gru.ai 在 SWE-Bench-Verified 评估最新发布的数据中以 45.2% 的高分排名第一。SWE-Bench-Verified 是 OpenAI 联合 SWE 发布测试集&#xff0c;旨在更可靠的评估 AI 解决实际软件问题的能力。该测试集经由人工验证打标&#xff0c;被认为是评估 AI 软…...

一文读懂SpringMVC的工作原理

前言 MVC是经典的软件架构设计模式&#xff0c;几乎在各个领域各种开发语言中&#xff0c;均采纳了这个思想。此刻博主突然想到了Thinking in xxx系列设计书籍。换句话说&#xff0c;就是“各人自扫门前雪”和“术业有专攻”。当职责分配得当后&#xff0c;剩下的就是发挥各“…...

【python-斐波那契数列和完美数之间的区别】

斐波那契数列和完美数在数学领域中是两个截然不同的概念&#xff0c;它们之间存在明显的区别。以下是对这两个概念及其区别的详细阐述&#xff1a; 斐波那契数列 定义&#xff1a; 斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;是一个在数学上具有重要意义的数列。它…...

【redis】本地windows五分钟快速安装redis

用处&#xff1a;本地自测&#xff0c;有时候公司redis环境不稳定&#xff0c;用自己的 1.下载&#xff0c;github下载一个解压缩在自己想要的位置 选择版本&#xff1a;Redis-7.4.0-Windows-x64-msys2-with-Service&#xff0c;zip GitHub - redis-windows/redis-windows: …...

arm64高速缓存基础知识

高速缓存的替换策略 随机法&#xff1a;随机地确定替换的高速缓存行&#xff0c;由一个随机数产生器产生随机数来确认替换行 FIFO法&#xff1a;选择最先调入的高速缓存行进行替换 LRU法&#xff1a;最少使用的行优先替换。 高速缓存的共享属性 内部共享的高速缓存通常指的…...

物管王 物业管理系统软件

物管王 物业收费管理系统软件 网络版...

YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)

YOLOv10改进&#xff1a;CA注意力机制【注意力系列篇】&#xff08;附详细的修改步骤&#xff0c;以及代码&#xff09; 如果实验环境尚未搭建成功&#xff0c;可以参考这篇文章 ->【YOLOv10超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;】 文章链接为&…...

使用go语言获取海南七星彩历史开奖记录并打印输出

效果如下 : 1.引用json与http模块 import ("encoding/json""fmt""github.com/nahid/gohttp" ) 2.创建请求: req := gohttp.NewRequest()resp, err := req.Get("这里填写请求地址")if err != nil {panic(err)} 3.处理响应结果 : if…...

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中&#xff0c;数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互&#xff0c;它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外&#xff0c;设计模式如单例模式可以帮助我们更好地管理和控制对象的创…...

记录ssl epoll的tcp socket服务端在客户端断开时崩溃的问题

文章目录 当客户端关闭后&#xff0c;Epoll 的 TCP socket 服务端会收到两次断开事件可能有以下原因及解决方法&#xff1a;原因分析解决方法 问题ssl socket服务端代码出错现象第一次尝试修改正确改法附上客户端代码 记录ssl epoll的tcp socket服务端在客户端断开时接收到多次…...

ubuntu任何版本 卡死 解决办法

首先&#xff0c;我们一定要记得ubuntu一定不要强制关机&#xff0c;一定&#xff0c;一定 因为90% 的可能你的电脑从此就会黑屏开不了机了&#xff0c;然后你就可以按照我的方法去卸载&#xff0c;重装ubuntu系统了。/(ㄒoㄒ)/~~ &#xff08;如果能解决您的问题&#xff0c…...

算法-合并区间(56)

这道题可以用列表来写&#xff0c;首先对所有的数组区间依据第一个数字进行排序&#xff0c;然后创建一个数组列表存放合并重叠后的结果。 如果列表为空&#xff0c;或者当前区间的起始位置大于列表中区间的最后一个位置&#xff0c;则不重叠直接插入列表&#xff0c;否则合并…...

港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”&#xff0c;做了题为“三个创新&#xff1a;培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…...

随机森林在天文大数据中的应用:高红移类星体高效筛选实战

1. 项目概述&#xff1a;用机器学习在星海中“捞针”在广袤的宇宙中寻找高红移类星体&#xff0c;就像是在一片无垠的星海里打捞一根特定的针。高红移类星体&#xff0c;作为宇宙早期最明亮的天体&#xff0c;是研究宇宙再电离时期、超大质量黑洞早期增长以及大尺度结构形成的绝…...

模型不确定性下的公平性评估:自一致性指标与集成弃权策略

1. 项目概述&#xff1a;当公平性评估遭遇模型不确定性在机器学习&#xff0c;尤其是公平性评估这个领域&#xff0c;我们常常会陷入一种“确定性幻觉”。我们训练一个模型&#xff0c;在某个测试集上计算其误判率、假阳性率、假阴性率&#xff0c;然后得出一个结论&#xff1a…...

不只是open-vm-tools:让ArchLinux与VMware无缝协作的完整服务清单

不只是open-vm-tools&#xff1a;让ArchLinux与VMware无缝协作的完整服务清单在虚拟化环境中&#xff0c;ArchLinux以其极简和高度可定制的特性吸引着技术爱好者。然而&#xff0c;与VMware的深度集成往往被简化为"安装open-vm-tools"的单一操作&#xff0c;忽略了完…...

量子计算模拟Hubbard模型:算法实现与噪声分析

1. Hubbard模型与量子计算模拟概述在凝聚态物理研究中&#xff0c;Hubbard模型堪称是研究强关联电子系统的"果蝇模型"。这个看似简单的理论框架却能展现出从金属-绝缘体相变到高温超导等丰富物理现象。模型的核心哈密顿量包含两项关键竞争&#xff1a;H -t∑⟨i,j⟩…...

PCA-ANN-PWA框架:破解大规模非线性系统全局优化难题

1. 项目概述与核心挑战在化工、能源、材料等过程工业领域&#xff0c;我们工程师经常面临一个头疼的难题&#xff1a;如何对一个包含数百甚至数千个状态变量的大型非线性系统进行高效、可靠的全局优化&#xff1f;这类系统通常由复杂的偏微分方程组描述&#xff0c;比如反应器内…...

MySQL INSERT报错注入原理与实战:updatexml/extracvalue利用详解

1. 这不是“填空题”&#xff0c;而是数据库在向你尖叫&#xff1a;insert注入报错法的本质很多人第一次看到“SQL注入”四个字&#xff0c;下意识就想到登录框里输 or 11 --&#xff0c;然后弹出所有用户数据——那是select语句的天下。但真实渗透测试中&#xff0c;真正让目标…...

MLQM:用机器学习加速量子比特映射,破解量子编译“最后一公里”难题

1. 项目概述与核心挑战量子计算这行&#xff0c;这几年硬件跑得飞快&#xff0c;但软件栈这块&#xff0c;尤其是怎么把咱们写的量子程序高效、保真地“烧录”到真实的量子芯片上&#xff0c;一直是个头疼的“最后一公里”问题。这其中的关键一步&#xff0c;就是量子比特映射。…...

量子电路生成式AI技术:原理、应用与挑战

1. 量子电路生成式AI技术概述量子计算正在经历一场由生成式人工智能技术驱动的变革。作为量子计算的基本构建块&#xff0c;量子电路的自动生成技术正在从理论探索快速转向实际应用。这项技术通过AI模型自动产生可执行的量子电路描述&#xff0c;包括Qiskit代码、OpenQASM程序和…...

从零读懂RDMA流控机制:为什么RC需要“信用”

我们在之前的文章里讲过,RDMA RC(可靠连接)模式像一条点对点的专用通道:发送端发数据,接收端确认,丢了包硬件重传。一切看起来很简单,但有一个关键问题没解决: 发送端怎么知道接收端“吃得下”自己发过去的数据? 如果发送端不管不顾地疯狂发,而接收端处理不过来,数据…...

保姆级教程:用Arbe或大陆4D毫米波雷达点云数据,手把手实现Freespace检测(附Python伪代码)

毫米波雷达点云实战&#xff1a;从数据到可行驶区域的完整工程指南在自动驾驶感知系统中&#xff0c;可行驶区域检测&#xff08;Freespace&#xff09;直接决定了车辆路径规划的可行空间边界。相比激光雷达和摄像头方案&#xff0c;4D毫米波雷达凭借全天候工作能力、成本优势和…...