【问题标题】:(C) what ways can we manipulate memory length and addresses?(C) 我们可以通过哪些方式来操作内存长度和地址?
【发布时间】:2019-08-15 02:22:14
【问题描述】:

我很难向很多人提出这个问题。如果这里的任何人可以帮助我对此有所了解,我将不胜感激,因为这是我的问题近三年来的终极障碍。

如果你知道你的数组和内存而不是跳过最后一段来回答这个大问题,但是如果你通读它可能会帮助你理解我为什么以及我难以掌握的概念。

所以我们有一个初始化的数组

诠释主要(){ 诠释 x=10; int arr[x]={3,5,1,9,4,17,2,12,6,8};

要访问数组的第 5 个元素,我们将其打印如下

printf("%d",arr[4]);

现在,我的第一个问题围绕着这个过程。 printf 函数定义我要打印一个整数,作为一个目录,我给它第一个元素的数组名称/地址,并指定我想要数组的第 4 个元素。

到目前为止,我所掌握的信息让我相信每个整数占用 4 个字节的内存。通常,在课堂环境中,当教授解释这一点时,他们会在黑板上画出来

0 1 2 3 4 5 6 7 8 9 [1000][1004][1008][1012][1016][1020][1024][1028][1032][1036] { 3 5 1 9 4 17 2 12 6 8 }

现在,这都是基本的,但在我学习计算机如何工作的过程中,我意识到一件非常重要的事情,计算机非常愚蠢,这就是我们对其进行编程的原因,所以请多多包涵。

问题 1:这是对记忆的准确表示吗?这就是 youtube、教室等上几乎每个人的描绘方式,一个从 1000 开始并增加 +4 的顺序列表,如果我有两个相同大小的数组怎么办?它们不能占用相同的内存地址,所以我怎样才能跟踪位置。

问题 2:我理解 arr[4];指的是数组第4个位置的值。但是这个arr[4],它是什么? 4.这个4是否存储在内存中的某个地方?这是什么数据类型 4?它也是一个指针吗?我的理解是它是指针数组的扩展,这让我感到困惑。因为数组指向位置 0 的第一个元素,指针“4”如何在指针内部共存?计算机的过程是什么样的?我假设它不是问题,因为 4 是一个指针参数,因此可以存在于指定的数组指针中。

但是过程呢?是吗,去 arr[0] 然后从位置 0 计算 4 个字节 4 次?位置 0 持有什么地址?我知道出于教学目的,它的可视化是从 1000 开始,但总是这样吗?为什么不解决 1036 并从那里数 4 呢?我知道我在某处读到内存地址通过确保 char(1 字节)存储在 int(4 字节)旁边的内存中来划分存储空间,然后在它们之间存在内存间隙以使其全部可被 2 整除。

所以现在我的最后一个问题,我在 interwebz 上找不到任何关于它的内容。我可以以某种方式告诉计算机将索引 0 - n 的内存长度分配给变量吗?也许我问错了,所以让我改一下。是否有定义内存长度而不是位置的数据类型?我知道我们可以访问某个变量占用的内存量,但要做到这一点,我们会引用该变量并因此接收内存。我想为变量分配一段内存。

【问题讨论】:

  • 我认为你应该问问你的老师——那是他们的报酬。
  • 这个问题对于 Stack Overflow 来说可能太宽泛了。可能对您有所帮助的一件事是学习一点汇编语言(可能适用于简单的微控制器,可能适用于 x86)。了解 C 代码编译成的内容将使 C 代码的工作方式更有意义。
  • 注意:您假设底层硬件架构是 32 位的。根据具体的 CPU,它可能是 8 位、16 位、32 位、64 位。请注意,对于操作系统,它是您使用&array[4] 获得的虚拟地址,而array[4] 指的是数组中的第 5 个元素,因为在 C 中,数组的索引范围为 0...(数组中的元素数-1)。所以array[4] 引用了数组中的第 5 个元素
  • 关于:我给它第一个元素的数组名称/地址,并指定我想要数组的第 4 个元素。不完全正确。实际上函数 printf() 正在接收数组中第五个元素的内容
  • 关于:是否有定义内存长度而不是位置的数据类型?您可能想查看函数:strlen() 和类似的。另请阅读有关地址上的数学运算的实际处理方式

标签: c


【解决方案1】:

是否有定义内存长度而不是位置的数据类型?

C 中的所有数据类型都这样做。每种类型都定义了保存该类型需要多少字节以及每个字节中的各个位的含义。这是实现定义的,因此不同的编译器和不同的目标对它们的定义不同,但是该语言为您提供了编写可移植代码的工具,这些代码将以明确定义的方式工作。

  • sizeof 告诉您任何类型的大小(以字节为单位)。所以sizeof(int) 会告诉你int 在你的目标上有多大——通常是 4,但有些目标使用 8 或 2。
  • CHAR_BIT 告诉你一个字节的大小——一个字节有多少位。您并不经常需要它,但当您需要时,它就可用。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多