【问题标题】:How does array offset access actually work [closed]数组偏移访问实际上如何工作[关闭]
【发布时间】:2022-11-11 13:12:25
【问题描述】:

我们都知道在眨眼之间访问数组元素是多么容易:

#include<stdio.h>
int main()
{
    int array[10];
   
    array[5]=6;  //setat operation at index 5

    printf("%d",array[5]);  //getat operation
}

是的,这个问题听起来可能有点愚蠢,但是编译器是如何让您快速获得您想要访问以插入数据或显示数据的索引。它是否会自行遍历该索引以完成 setat(),getat() 操作。

因为一般手段是:如果要求您从 1000 个单位的行中选择第 502 个元素,您将开始计数,直到您得到计数 502(在计算机 501 的情况下),这在计算机中是否发生同样的情况。

【问题讨论】:

  • 您的标题完全具有误导性,通过附加括号使问题中似乎有 getat 和 setat 方法
  • C 不是一种非常高级的语言。当你索引到一个数组时,这就是你所做的。代码将在指向数组第一个元素的指针的偏移处访问内存。没有getatsetat,为简单的指针+偏移量查找添加函数调用将是愚蠢的。通常,将同构数组实现为链表在任何低级别都没有多大意义。
  • 数组[5] = 6。您知道“数组”的起始地址(例如:100)和每个元素的大小(int=4),因此您可以执行 100 + 4*5 并最终到达特定元素 5,然后将 6 放在那里

标签: arrays c


【解决方案1】:

该数组存储在随机存取存储器 (RAM) 中。 RAM 被分成大小相等、可单独寻址的单元,例如字节。可寻址意味着可通过地址枚举,该地址是一个数字。随机访问意味着处理器不必遍历地址 0 到 499 即可访问位置 500。它直接进入 500。它的工作原理是计算机将地址 500 的二进制表示放在一组信号线上称为“地址总线”。所有连接到地址总线的设备同时检查地址,它们的电路回答“这个地址在我的范围内吗?”这个问题。答案是肯定的设备,然后开始行动。

在 RAM 的情况下,它的电路进一步解码地址以确定激活哪个存储体的哪一行和哪一列。读出的值被放置在数据总线上供处理器收集。由于缓存,实际实现要复杂得多,但这是基本思想。

主要思想是机器使用地址访问内存和类似内存的资源(例如 I/O 端口),并且地址作为一组电信号并行分布到所有设备,可以看马上去;这些设备本身具有并行电路,可以进一步分析地址以识别其内部的特定资源。因此寻址发生得非常快,无需搜索未被寻址的资源。

C 语言数组是一个非常底层的概念。 C 数组位于内存中的某个地址并保存相同大小的对象。通过执行算术访问这些对象。例如,如果数组元素是 8 字节宽,那么访问第 17 个元素意味着机器必须乘以 17 x 8 以产生偏移量 136,然后将其添加到数组的地址以产生元素的地址。

在您的程序中,您有表达式array[5]5 的值在编译时(在程序被翻译、链接和执行之前)为 C 编译器所知。 int 类型的数组元素的大小在编译时也是已知的。 array 的地址在编译时是未知的。因此,偏移量计算可能发生在编译时; 5 被转换为在编译时计算的 sizeof (int) * 5 偏移量到类似 20 的值,然后在运行时将其添加到 array 的地址以计算 array[5] 的地址并从中获取其值那个地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多