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

PIC*_*ain 9 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
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 17

那样做,但只是做到了:

 writeSECTOR( destAddress, &BufferData[i * 512]);
Run Code Online (Sandbox Code Playgroud)

(听起来像writeSECTOR真的应该采取unsigned char*虽然)


rek*_*o_t 8

你可以这样做BufferData + i * 512.+char*上的算术运算符在向其添加整数值时会产生char*.


loc*_*cka 6

指针算术很容易理解.如果你有一个指向数组第一个元素的指针,那么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
Run Code Online (Sandbox Code Playgroud)

如果你的数组是unsigned char,那么你只需要添加许多你想要进入数组的字节偏移量,例如

unsigned char data[16384];
unsigned char *offset = data + 512; // same as &data[512]
*offset = 5; // same as data[512] = 5;
Run Code Online (Sandbox Code Playgroud)

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