【问题标题】:What is the correct way to offset a pointer?偏移指针的正确方法是什么?
【发布时间】:2010-10-06 13:05:45
【问题描述】:

我想传递一个指向函数的指针。我希望这个指针指向数组中间的某个地方。假设我有一个像unsigned char BufferData[5000]; 这样的数组,下面的语句在语法上是否正确?

writeSECTOR( destAddress, (char *)( BufferData + (int)(i * 512 )) );
// destAddress is of type unsigned long
// writeSECTOR prototype: int writeSECTOR ( unsigned long a, char * p );
// i is an int

【问题讨论】:

  • 是的。强制转换为int 是不必要的,否则您的声明是有效的。
  • 事实上,我认为您的解决方案比下面许多建议的答案要好!
  • 我更喜欢 &array[i] 方法,因为它更明显的是您将指针偏移到数组中,即 BufferData+(i*512) 关于其意图的可读性低于 &BufferData[i*512 ].
  • @Cthutu 我不同意。 array + i&array[i] 更具可读性,因为我将后者读作“取消引用数组、元素 i 并获取地址”,而不是更简单的“地址偏移 i 从数组”。您最喜欢的符号的问题在于它在一个语句中在指针和取消引用之间切换。而指针加法只是纯数学。
  • 你不是真的因为编译器会产生相同的代码。但这确实是一个主观的事情。当我看到数组括号时,我知道它是指向数组的指针并考虑范围。

标签: c arrays pointers offset


【解决方案1】:

可以,但只要做到:

 writeSECTOR( destAddress, &BufferData[i * 512]);

(听起来 writeSECTOR 确实应该采用 unsigned char*)

【讨论】:

    【解决方案2】:

    你可以做BufferData + i * 512。 char* 上的算术 + 运算符会在您向其添加整数值时生成 char*。

    【讨论】:

      【解决方案3】:

      指针算法很容易理解。如果您有一个指向数组第一个元素的指针,则 p + 1 指向第二个元素,依此类推,无论每个元素的大小如何。因此,即使您有一个整数数组或任意结构 MyData,它也将成立。

      MyData data[100];
      MyData *p1 = data;;  // same as &data[0]
      MyData *p2 = p1 + 1; // same as &data[1]
      MyData *p3 = p2 + 1; // same as &data[2]
      MyData *p4 = p2 - 1; // same as &data[0] again
      

      如果您的数组是无符号字符,那么您只需添加您希望进入数组的字节偏移量,例如

      unsigned char data[16384];
      unsigned char *offset = data + 512; // same as &data[512]
      *offset = 5; // same as data[512] = 5;
      

      或者,如果符号令人困惑,您可以随时引用它,如上面的 cmets 所示,例如&data[512]

      【讨论】:

        【解决方案4】:

        应该可以。在 C 中,将整数添加到指针会增加指针的整数乘以指针指向的类型sizeof

        【讨论】:

          【解决方案5】:

          看起来不错,但是在编译器上试试,

          您可以使用 writeSECTOR(destAddress, &BufferData[i * 512]);

          【讨论】:

            【解决方案6】:

            看起来它会传入数组中第 i*512 个元素的地址。这是你想要它做的吗?

            不过,我真的不明白转换为 int 对你有什么好处。

            【讨论】:

              【解决方案7】:

              这应该如您所想。 C 中的指针只是 RAM 中的一个地址,因此您可以在度量中漂移指针。

              【讨论】:

                猜你喜欢
                • 2010-09-18
                • 1970-01-01
                • 2016-09-25
                • 1970-01-01
                • 2011-03-12
                • 2012-06-18
                • 1970-01-01
                • 2013-04-16
                • 1970-01-01
                相关资源
                最近更新 更多