Как правильно сместить указатель? - PullRequest
9 голосов
/ 06 октября 2010

Я хочу передать указатель на функцию.Я хочу, чтобы этот указатель указывал на какое-то место в середине массива.Скажем, у меня есть массив, подобный 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 ]

17 голосов
/ 06 октября 2010

Это бы сработало, но просто сделайте это:

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

(Похоже, что writeSECTOR действительно должен принимать беззнаковый символ *)

7 голосов
/ 06 октября 2010

Вы можете просто сделать BufferData + i * 512. Арифметический оператор + для char * возвращает char *, когда вы добавляете к нему целочисленное значение.

5 голосов
/ 06 октября 2010

Арифметика указателя довольно проста для понимания. Если у вас есть указатель на первый элемент массива, то 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;

В качестве альтернативы, если обозначение сбивает с толку, вы всегда можете обратиться к нему, как показано в комментариях выше, например, &data[512]

3 голосов
/ 06 октября 2010

Это должно работать. В C добавление целого числа к указателю увеличивает указатель на целое число, умноженное на sizeof тип, на который указывает указатель.

0 голосов
/ 06 октября 2010

Это должно работать, как вы думаете.Указатель в C - это просто адрес в ОЗУ, поэтому вы можете сместить указатель в своей мере.

0 голосов
/ 06 октября 2010

Похоже, он будет передаваться по адресу i * 512-го элемента массива.Это то, что вы хотите, чтобы он делал?

Я действительно не понимаю, что этот бросок на int покупает вас.

0 голосов
/ 06 октября 2010

выглядит нормально, но попробуйте на компиляторе,

Вы можете использовать writeSECTOR (destAddress, & BufferData [i * 512]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...