(C)我们可以通过哪些方式操作内存长度和地址?

问题描述 投票:0回答:1

我很难向很多人提出这个问题。如果有人在这里可以帮助我阐明这一点我会非常感激,因为这是我的问题近三年的终极路障。

如果你知道你的数组和内存而不是跳过最后一段来讨论这个大问题,但是如果你仔细阅读它,它可能会帮助你理解为什么以及我正在努力掌握的概念。

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


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

要访问数组的第5个元素,我们将按如下方式打印出来


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

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

到目前为止我所掌握的信息让我相信每个整数占用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个位置的值。但是这个[4],它是什么? 4.这4是存储在某个地方的内存吗?这个4的数据类型是什么?它也是指针吗?我的理解是它是指针数组的扩展,这让我感到困惑。因为数组指向位置0的第1个元素,指针“4”如何在指针内共存?这个过程对于计算机来说是什么样的?我假设它不是问题,因为4是一个指针参数,因此可以存在于指定的数组指针中。

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

现在谈谈我的最后一个问题,我无法在interwebz上找到任何关于。我可以以某种方式告诉计算机将索引0 - n的内存长度分配给变量吗?也许我以错误的方式提问,所以让我重新说一下。是否存在定义内存长度而非位置的数据类型?我知道我们可以访问某个变量所占用的内存量,但为此我们引用该变量并接收内存作为结果。我想为变量分配一段内存。

c
1个回答
0
投票

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

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

  • sizeof以字节为单位告诉您任何类型的大小。所以sizeof(int)会告诉你int在你的目标身上有多大 - 一般是4,但有些目标使用8或2。
  • CHAR_BIT告诉你一个字节的大小 - 一个字节中有多少位。你不经常需要这个,但是当你这样做时,它是可用的。
© www.soinside.com 2019 - 2024. All rights reserved.