首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >数组中的指针。它是如何在记忆中“物理”工作的?

数组中的指针。它是如何在记忆中“物理”工作的?
EN

Stack Overflow用户
提问于 2018-04-10 13:01:09
回答 1查看 56关注 0票数 0

我一直在想关于指针的问题,却找不到一个来源来解释它们的细节。

例如。给定数组int a3,是否有指向4个位置的指针?它以*a+0开头,并指向地址a?那么接下来它会做什么呢?Int至少有16位,所以它需要读取2个字节,但是每个字节都有一个地址。

这是否意味着对于起始地址的指针点,程序读取从给定地址开始的相当大的(Int)字节?

接下来它会做什么?如果它停止阅读,给出结果,对于a1,它会指向&a+1*sizeof(int)的地址吗?它将从地址开始读取(&a+2(作为2表示已经读取的地址为2字节),开始读取,所以它将读取另外的2字节和开始?

我不太明白这些概念。

字符串由无符号字符组成,这是一个字节元素。您提到的post没有解释大于1字节的元素会发生什么。它也没有确切地解释程序在“这是程序从内存中读取的字符串”旁边做了什么。我想我是对的,但你提到的标题与我所问的相去甚远。(既然有人已经写了这个,一个地址就代表一个字节)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|----|----|----|----|----|----|    |    |    |    |    |    |    |    |    |    |
0----+----01---+----12---+----2----+----+----+----+----+----+----+----+----+----+

我特别询问int a2是否意味着指针首先是:在内存地址( 54 )上点,程序从以下两个地址读取数据(54到54作为int取2个字节),然后指针点在地址54+2,程序开始从地址范围<56,57>读取数据。再一次,指针指向58的起始范围,程序读取<58,59>的地址。

这个逻辑正确吗?它不是以NULL结尾的字符串。我对字符串的猜测是,程序将按字节地址访问内存字节的地址,并读取这些值直到找到NULL为止。

数组不是字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 13:52:09

考虑一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a[3] = {};
int b[300] = {};

这两个数组“相似”,因为它们包含int的值,并且在这两个主要方面不同:

  1. 它们具有不同的“大小”--即它们指向的内存为每个内存都保留了不同的数量。第一个数组指向保留用于保存至少3 int值的内存。然而,这是最小分配的内存(在本例中-在堆栈上,因此很可能也是为其分配的精确内存量)。
  2. 它们指向内存中的不同的地址(同样--在本例中,它们都是在堆栈上分配的,但仍然是内存)

您也可以轻松地获取任意一个数组的第一个元素的地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int * p = a;
p = &a[0]; // same as above
p = b; // now p points to the first element of the second array

当您执行索引操作时,编译器所做的是:它获取第一个元素的地址,并将其增量为等于索引的值乘以每个元素的大小(当然,如果由于对齐而没有填充)。本质上,编译器就是这样做的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b[1] = 1;
*(p+1) = 1; // same as above
uint8_t * c = reinterpret_cast<uint8_t*>(p); // WARNING! Explanation follows

最后一行将导致编译器以不同的方式重新解释指针,而“相同的”地址算法“突然”的工作方式不同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c[1] = 1; // this is NOT the same as b[1] = 1

在这种情况下,编译器只会“移动”指针8位(而不是16位或32位,取决于平台的sizeof(int)),并最终位于数组b的第一个int元素的中间。当然,这可能是有用的(特别是当直接处理硬件),但是超级杜帕普不可移植,你应该避免在任何时候这样做!

诚然,这不是一个全面的答案,但我并不打算提供一个答案,因为这个主题非常广泛,而且网上有大量的资源可以为您提供关于这个主题的更多细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49762790

复制
相关文章
将tensor转换为图像_tensor转int
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
11.4K0
双精度,单精度和半精度
浮点数是计算机上最常用的数据类型之一,有些语言甚至数值只有浮点型(Perl,Lua同学别跑,说的就是你)。
用户1148523
2019/05/27
6K0
java map 转string_java-将Map <String,Object>转换为Map <String,String>
Map map = new HashMap(); //Object is containing String
全栈程序员站长
2022/08/25
12.3K0
Golang中Int32转换为int16丢失精度的具体过程
Int32转换为int16会丢失精度,这是总所周知的,但是具体如何丢失精度的,请看下面的代码:
全栈程序员站长
2022/09/21
2.4K0
Golang中Int32转换为int16丢失精度的具体过程
double转bigDecimal精度问题
double转bigDecimal精度问题 需要用到bigDecimal的字符串构造来转
全栈程序员站长
2022/09/05
2K0
double 转 BigDecimal 精度问题
很明显,经过 double 转 BigDecimal 后,我们最初的值已经发生变化,所以通常我们在做类型转换的时候推荐使用 BigDecimal.valueOf(…);
全栈程序员站长
2022/09/05
1.4K0
double转BigDecimal精度丢失[通俗易懂]
很多人在double或float转BigDecimal时习惯使用BigDecimal的构造方法new BigDecimal(33.33),此种写法会存在精度丢失问题,下面就具体实例带大家体会:
全栈程序员站长
2022/09/05
2.4K0
APP性能测评分析
1.1流畅度相关概念 刷新率 vs 帧率 刷新率:美妙屏幕刷新次数,手机品目的刷新率是60HZ 帧率:GPU在一秒内绘制的帧率
用户10443079
2023/03/21
1.7K0
APP性能测评分析
ChatGPT教你APP性能评测分析
请打开智造喵GPT地址:https://chat.plexpt.com/i/511440
用户10443079
2023/04/25
1.1K0
ChatGPT教你APP性能评测分析
【Qt源码笔记】简要说说 Qt5 中的 HighDPI 支持
想起之前在公司做的关于 HighDPI 的适配,在 Qt4 下可以说是比较繁琐,代码敲到手疼。早就听说 Qt5.6 开始支持了 HighDPI ,一直没机会看详细的代码。一直到开始做 Gal ,才刚好在 Qt5 下需要 HighDPI 支持。用过之后,真的感叹,用起来太方便了。故看了一下详细实现。不过比较遗憾的是代码中有一个小瑕疵。
Harper
2021/07/27
2.9K0
30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient
渐变有三种:QLinearGradient、QConicalGradient 、 QRadialGradient 它们都有一个QGradient父类 QGradient父类的常用公共函数有: void QGradient::setSpread ( Spread method ); //设置填充梯度区域外的区域,参数有: // QGradient::PadSpread :填充区域内最接近的停止颜色。这是默认的。 // QGradient::RepeatSpread : 在区域外继续重复填充 // QGrad
诺谦
2018/07/05
1.8K0
31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
30.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient
诺谦
2018/07/30
2.6K0
31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
Qt官方示例-K线图
使用Qt的QCandlestickSeries类实现K线图绘制。 0x01 创建K线图 QCandlestickSeries *acmeSeries = new QCandlestickSeries
Qt君
2020/08/04
4.4K0
Qt官方示例-K线图
Qt官方示例-嵌套甜甜圈
  先创建一个QChartView实例并启用抗锯齿。然后从QChartView实例获得一个QChart对象。
Qt君
2020/05/08
1.5K0
Qt官方示例-嵌套甜甜圈
qml类型有那些?
以表格方式列出支持那些类型。 Qml类型与Qt类型对照表 Qml类型 Qt类型 bool bool int unsigned int, int double double real float, qreal string QString url QUrl color QColor font QFont date QDateTime point QPoint, QPointF size QSize, QSizeF rect QRect, QRectF matrix4x4 QMatrix4x4 quaterni
Qt君
2019/08/27
1.5K0
Qt官方示例-图表标注
  标注核心要点:QChart类提供了两种方法来映射场景坐标和系列域(由坐标轴范围定义)。
Qt君
2020/05/08
1.4K0
Qt官方示例-图表标注
Qt for android触摸手势事件QGestureEvent「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197398.html原文链接:https://javaforall.cn
全栈程序员站长
2022/10/03
1.8K0
qt将毫秒级时间戳转换为日期(js把对象变成字符串)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128759.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
6.7K0
Qt官方示例-极坐标图
  轴的创建与笛卡尔图表相似,但是将轴添加到图表时,可以使用极坐标方向而不是对齐方式。
Qt君
2020/03/19
3.3K0
Qt官方示例-极坐标图
java将字符串转换为json对象的方法_java jsonobject转string
在与服务器交互的时候,我们往往会使用json字符串,今天的例子是java对象转化为字符串,
全栈程序员站长
2022/11/08
21.2K0

相似问题

无法将双精度转换为双精度

22

如何将双精度*转换为双精度?

60

将0.0转换为双精度有什么问题?

52

将C++双精度转换为DEC双精度

35

如何将sql datetime2转换为双精度?

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文