【发布时间】: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