【问题标题】:Basic Pointer Arithmetic that has me stumped让我难过的基本指针算法
【发布时间】:2012-04-03 17:57:57
【问题描述】:

我正在解决一个使用指针算法的问题,我发现这个小sn-p 的代码可以工作。我不明白它到底在做什么。对我来说,它看起来像是将缓冲区的地址 + ix3 的值分配给数组元素 a[i]。我不知道为什么这与我的程序有关。谁能告诉我这个循环到底发生了什么?

int *buffer=new int[5*3];

for (i=0;i<5;i++)
    a[i] = buffer+i*3;

【问题讨论】:

  • 它以什么方式“工作”?有什么不寻常的?
  • 你应该添加变量a的类型。它应该是指向整数的指针数组。记住这一点,它可能有助于了解更多的程序。如果 a 的类型不是整数指针数组,您可能会显示更多代码。
  • @harper a 在变量列表中定义为 int** a;并将在程序后面用作二维数组。

标签: c++ arrays pointers memory-management


【解决方案1】:

表达式

buffer+i*3

等同于

&buffer[i*3]

所以你的假设是正确的,我希望a[] 是一个指针数组。

请注意,像buffer+k 这样的指针运算不会buffer 中包含的地址值加上k:相反,它等于&amp;buffer[k] 的值,应该等于buffer 中包含的地址值 + k * sizeof(buffer 指向的类型)。

【讨论】:

  • 是的 a 被定义为 int** a;在我的变量列表中,稍后在程序中充当二维数组。我想将 a 的所有值写入一个连续的内存块(缓冲区)。这是我看到的解决方案中唯一不明白的代码行。我不是 100% 确定这是如何工作的
  • a 指向的值已经在一个连续的内存块中,即分配给new 的内存块。
  • 不,我的意思是我希望 a 的类型是指针数组,正如 adohertyd 澄清的那样。
【解决方案2】:

它完全按照你说的做。数组a(您没有显示其定义)可能具有int* [5] 类型。

这样做的目的是启用正常的双索引(即无需不断进行索引运算)。要看到这一点,请考虑如果您访问 a[1][2] 会发生什么。在上述循环之后,a[1] 包含值buffer + 3,即它指向buffer第四 元素(将n 添加到指针移动指针n 元素 向前)。所以a[1][2](buffer+3)[2] 相同,它访问比buffer+3 指向的位置更远两个元素的值,换句话说,它相当于buffer[5]

更一般地说,在此初始化之后,a[i][k] 访问与 buffer[3*i+k] 相同的元素(当然,除非i 大于 4)。

【讨论】:

    【解决方案3】:

    buffer+i*3; 只是 &amp;buffer[i*3]; 的一种迂回方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多