数组,指针 易混题解析(二)

目录

一.基础

1.

2.

二.中等

1. 坑

2.

3.指针+1到底加什么

三.偏难

1.(小端   x86)

2.通过数组指针进行偏移的时候怎么偏移

3. 大BOSS

(1)**++cpp

(2)*-- * ++cpp + 3

(3)*cpp[-2] + 3

(4)cpp[-1][-1] + 1


一.基础

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

&a 是整个数组的地址,类型:int (*)[5]     &a+1 的类型还是 int (*)[5]

存到 int * 类型的指针 ptr 中,要强制类型转换。

   答案:2 5

2.

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+1) 等价于 aa[1] 是第二行的数组名,是第二行第一个元素的地址。

   答案:5 10

二.中等

1. 坑

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

坑:二维数组内部分行的时候,要用 {  } 。  这里的 ( )是3个逗号表达式。

所以题目等价于:

int main()
{int a[3][2] = { 1, 3, 5 };int* p;p = a[0];printf("%d", p[0]);return 0;
}

a[0] 是第一行的数组名,是第一行首元素的地址。     p[0] 等价于 * (p + 0)

   答案:1

2.

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

这里的 char* * pa  ,第二个 * 告诉我 pa 是指针 ,指向的是 char* 类型的元素 

这里的 a 是数组名,首元素的地址,传给 pa 。pa++ 后, pa 指向 a 第二个空间的地址。

*pa 解引用,a 第二个空间放的是  (char * 类型)'a' 的地址。从这里开始打印,直至 \0

   答案:at

3.指针+1到底加什么

指针+1,+的是指针指向对象的大小。

//由于还没学习结构体,这里告知结构体的大小是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;
}

1. p 是结构体指针,+1,+的就是一个结构体大小。+20 之后为 0x00100014

2. p 被强制转换为整型,p 里面的值被强制转换为整数。+1 结果为 0x00100001

3. p 是整型指针,整型指针+1,跳过1个整型。整型4字节。 结果为:0x00100004

三.偏难

1.(小端   x86)

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);// %x :以16进制打印return 0;
}

ptr1[-1] 是 *(ptr1 - 1)

注意:指针+1,+的是指针指向对象的大小。

a 是数组首元素的地址,假设为 0x0012ff40  被强制转换为 int (不是指针)。+1后为:0x0012ff41

再被转换为 int * 整型指针 ptr2。

但是,一个整型是4个字节,0x0012ff41 之加了一个字节,ptr2 并不指向 2 所在的地址

找到 ptr2 所指向的位置,再向后访问4个字节

答案:4 ,2000000

2.通过数组指针进行偏移的时候怎么偏移

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

p是指向4个整型的数组指针。对 指针 p+1,跳过4个整型

p 的类型:int (*)[4]         a 的类型:int (*)[5]

p[4][2]  ---  *(*(p+4)+2)

指针-指针,结果是中间元素个数。大-小为正,小-大为负。所以题目中相减结果为 -4

-4 用 %d 打印还是 -4              用 %p 打印:

-4
原码:10000000000000000000000000000100
反码:11111111111111111111111111111011
补码:11111111111111111111111111111100

-4 在内存中以补码形式存放,用 %p 打印时,就认为11111111111111111111111111111100是地址。

地址不存在什么原反补。类似于16进制打印:0x ff ff ff fc

3. 大BOSS

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

(1)**++cpp

cpp 里面存放的是 char** 的地址。++跳过一个 char** 的数据

**++cpp 最终拿到 POINT 里面 P 的地址

结果:POINT

(2)*-- * ++cpp + 3

先 ++cpp ,解引用。--  给里面的值自减1,修改了这块地址。再解引用。+3 后,指向 E 的地址。

结果:ER

(3)*cpp[-2] + 3

cpp[-2]  ----  * (cpp - 2)                   整个表达式转换:** (cpp - 2) + 3

结果:ST

(4)cpp[-1][-1] + 1

转换:* (* (cpp - 1) - 1) + 1

* (cpp - 1) - 1  这个表达式拿到的值是 c + 1  。不改变里面的值

结果:EW

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。

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

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

相关文章

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型,用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求,而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识,确保对业务需…

spring-security原理与应用系列:建造者

目录 1.构建过程 AbstractSecurityBuilder AbstractConfiguredSecurityBuilder WebSecurity 2.建造者类图 SecurityBuilder ​​​​​​​AbstractSecurityBuilder ​​​​​​​AbstractConfiguredSecurityBuilder ​​​​​​​WebSecurity 3.小结 紧接上一篇文…

结合代码理解Spring AOP的概念(切面、切入点、连接点等)

前情回顾 对AOP的理解 我这篇文章介绍了为什么要有AOP(AOP解决了什么问题)以及如何实现AOP。但在实现AOP的时候,并未探讨AOP相关概念,例如:切面、切入点、连接点等。因此,本篇文章希望结合代码去理解Spring…

【AI大模型】搭建本地大模型GPT-NeoX:详细步骤及常见问题处理

搭建本地大模型GPT-NeoX:详细步骤及常见问题处理 GPT-NeoX是一个开源的大型语言模型框架,由EleutherAI开发,可用于训练和部署类似GPT-3的大型语言模型。本指南将详细介绍如何在本地环境中搭建GPT-NeoX,并解决过程中可能遇到的常见问题。 1. 系统要求 1.1 硬件要求 1.2 软…

Copilot提示词库用法:调整自己想要的,记住常用的,分享该共用的

不论你是 Microsoft 365 Copilot 的新用户还是熟练运用的老鸟,不论你是使用copilot chat,还是在office365中使用copilot,copilot提示词库都将帮助你充分使用copilot这一划时代的产品。它不仅可以帮助你记住日常工作中常用的prompt提示词&…

Spring:AOP

一、AOP概念的引入 为了更好地介绍AOP,我们以登录作为示例。 首先,我们先来看一下登录的原理: 如图所示,这是一个基本的登录原理图,但是如果我们想要在这个登录过程上再添加一些新的功能,比如权限校验&am…

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的,我需要在Ubuntu中,实时读取正在播放音乐的音频流,然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现,好处是可以直接利用Helvum…

CUDA 学习(4)——CUDA 编程模型

CPU 和 GPU 由于结构的不同,具有不同的特点: CPU:擅长流程控制和逻辑处理,不规则数据结构,不可预测存储结构,单线程程序,分支密集型算法GPU:擅长数据并行计算,规则数据结…

前端会话控制技术:cookie/session/token

目录 前端中的 Cookie、Session 和 Token:详解与应用1. Cookie1.1 什么是 Cookie?1.2 Cookie 的工作原理1.3 Cookie 的特点1.4 Cookie 的用途1.5 Cookie 的安全性 2. Session2.1 什么是 Session?2.2 Session 的工作原理2.3 Session 的特点2.4…

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗,最短行走路线,最短行走时间等),在其工作空间中找到一…

Shopify Checkout UI Extensions

结账界面的UI扩展允许应用开发者构建自定义功能,商家可以在结账流程的定义点安装,包括产品信息、运输、支付、订单摘要和Shop Pay。 Shopify官方在去年2024年使用结账扩展取代了checkout.liquid,并将于2025年8月28日彻底停用checkout.liquid…

电阻的阻值识别

电阻买回来是有偏差的,不同的电阻种类,它的偏差大小会不一样,偏差越小的肯定越贵 主要看要求的精度要求是否越高 色环电阻或者说插件电阻 用来读数的几个色环它是比较靠近的,精度的色环跟用来读数的几个色环的间距会大一点点。 间…

quartz.net条件执行

quartz.net条件执行 在使用Quartz.NET时,你可能需要基于某些条件来决定是否执行一个任务。Quartz.NET本身并不直接支持基于条件执行任务的功能,但你可以通过一些策略来实现这一需求。下面是一些方法来实现基于条件的任务执行: 1. 使用触发器…

计算机操作系统(四) 操作系统的结构与系统调用

计算机操作系统(四) 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结(核心概念速记)&#xf…

NSSCTF(MISC)——[SUCTF 2018 招新赛]single-dog

相应的做题地址:https://www.nssctf.cn/problem/2324 分离图片 在1.txt中得到一段颜文字 http://www.hiencode.com/aaencode.html 解密得到flag

低功耗蓝牙(BLE)方案设计实战指南

一、BLE方案设计工具链 1. 硬件选型与开发平台 TI平台:CC2540/CC2541芯片,使用SmartRF Flash Programmer烧录Nordic平台:nRF51822芯片,使用nRFgo Studio管理协议栈常用调试工具:TI CC Debugger、J-Link(SW…

网络基础(一)

独立模式与网络互联 独立模式: 计算机之间相互独立。 网络互联:多台计算机连接在一起,完成数据共享。 注意:无论是主机内还是主机外,都是通过线来进行连接的,主机内线(线比较短)的连接主要考虑…

用Canvas 画布样式实现旋转的阴阳图

用Canvas 画布样式实现旋转的阴阳图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Canvas八卦图动画</title><style>/* 重置所有元素的默认样式 */* {padding: 0;margin: 0;box-sizin…

第16届蓝桥杯单片机4T模拟赛三

本次模拟赛涉及的模块&#xff1a;基础三件套&#xff08;Led&Relay&#xff0c;按键、数码管&#xff09; 进阶单件套&#xff08;pcf8591的AD模块&#xff09; 附件&#xff1a; 各模块底层代码在文章的结尾 一、数码管部分 1.页面1 页面1要显示的格式是&#xff1a; …

优选算法的睿智之林:前缀和专题(一)

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、前缀和 二、例题讲解 2.1. 一维前缀和 2.2. 二维前缀和 2.3. 寻找数组的中心下标 2.4. 除自身以外数组的乘积 一、前缀和 前缀和算法是一种用于处理数组或序列数据的算法&#xff0c;其核心思想是…