偏移指针的正确方法是什么?

时间:2010-10-06 13:05:46

标签: c arrays pointers offset

我想传递指向函数的指针。我希望这个指针指向数组中间的某个位置。假设我有一个类似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

7 个答案:

答案 0 :(得分:17)

那样做,但只是做到了:

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

(听起来像writeSECTOR真的应该采用unsigned char *)

答案 1 :(得分:7)

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

答案 2 :(得分:5)

指针算法很容易理解。如果你有一个指向数组第一个元素的指针,那么p + 1指向第二个元素,依此类推,无论每个元素的大小如何。所以,即使你有一个int数组,或任意结构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,那么你只需要添加许多你希望进入数组的字节偏移量,例如

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

或者,如果符号令人困惑,您可以随时引用它,因为它在上面的注释中显示,例如: &data[512]

答案 3 :(得分:3)

那应该有用。在C中,向指针添加一个整数会使指针增加整数乘以指针指向的sizeof类型。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

看起来它将传递数组的第i个第512个元素的地址。那是你想要的吗?

我真的没有看到那个施加给int的东西是在买你。

答案 6 :(得分:0)

这应该像你想象的那样奏效。 C中的指针只是RAM中的一个地址,因此您可以在指针中漂移指针。