数组中的指针。它在内存中如何“物理”工作?

时间:2018-04-10 21:01:10

标签: arrays pointers memory-address

我一直在想指针,无法找到解释它们的来源。

例如。给定一个数组int [3] 指针指向4个位置? 它以* [a + 0]开头并指向a的地址? 然后它接下来做什么? Int至少有16个字符,因此它需要读取2个字节,但每个字节都有一个地址。

这是否意味着对于[0]指针指向起始地址,那么程序从给定地址开始读取sizeof(int)字节?

接下来会做什么?它会停止阅读,给出结果和 对于a [1],它会指向& a + 1 * sizeof(int)的地址。 它将开始读取(& a + 2的地址(因为2代表已经读取的2个字节的地址)),开始读取,所以它会读取另外2个字节并打开和打开?

我不太明白这些概念。

PS:字符串由unsigned char组成,它是1个字节的元素。 你提到的帖子没有解释大于1字节的元素会发生什么。它也没有准确解释程序在“这是程序从内存中读取的字符串”旁边所做的事情。我认为我是对的,但你提到的标题远非我所提出的。 (因为有人写过这个,一个地址代表一个字节)

  54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|----|----|----|----|----|----|    |    |    |    |    |    |    |    |    |    |
0----+----01---+----12---+----2----+----+----+----+----+----+----+----+----+----+

我特意询问是否 int a [2]意味着指针首先: 在存储器地址(54)处的点,程序从2个以下地址读取数据(54到54,因为int占用2个字节),然后指针指向地址54 + 2,程序开始从地址范围&lt; 56,57&gt;读取。 。然后,指针指向58的起始范围,程序读取地址<&lt; 58,59&gt;

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

数组不是字符串。

1 个答案:

答案 0 :(得分:1)

考虑

int a[3] = {};
int b[300] = {};

这两个阵列是相似的&#34;因为它们包含int的值,并且在这两个主要问题上有所不同:

  1. 他们是不同的&#34;大小&#34; - 这是他们指向的内存,每个内存的保留金额不同。第一个数组指向保留用于保存至少 3 int值的内存。然而,这是最小分配的内存(在这种情况下 - 在堆栈上,因此很可能它也是为其分配的精确内存量)
  2. 他们指向内存中的不同的地址(再次 - 在这种情况下,它们都分配在堆栈上,但它仍然是RAM)
  3. 您可以轻松获取任一数组的第一个元素的地址:

    int * p = a;
    p = &a[0]; // same as above
    p = b; // now p points to the first element of the second array
    

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

    b[1] = 1;
    *(p+1) = 1; // same as above
    uint8_t * c = reinterpret_cast<uint8_t*>(p); // WARNING! Explanation follows
    

    最后一行将导致编译器以不同方式重新解释指针,并且&#34;相同的&#34;地址算术&#34;突然&#34;工作方式不同:

    c[1] = 1; // this is NOT the same as b[1] = 1
    

    在这种情况下,编译器只会&#34;移动&#34;指针为8位(不是16位或32位,具体取决于您的平台&#39; s sizeof(int)),最后是在数组的第一个int元素的中间 b。当然可以是有用的(特别是在直接与硬件打交道时),但是超级便携式非便携式,你应该始终避免这样做!

    这当然不是一个全面的答案,但我并不打算提供一个,因为主题非常广泛,网上有大量资源可以为您提供有关此主题的更多详细信息