2010-10-06 3 views
8

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

Да. Приведение в 'int' необязательно, но в противном случае ваше утверждение действительно. –

+2

На самом деле я бы сказал, что ваше решение лучше, чем многие из предложенных ниже ответов! –

+0

Я предпочитаю подход & array [i], поскольку его более очевидно, что вы смещаете указатель на массив, то есть BufferData + (i * 512) менее читабельны относительно его намерений, чем & BufferData [i * 512]. – Cthutu

ответ

16

Это будет делать, а просто сделать это:

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

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

3

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

6

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

0

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

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

0

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

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

5

Аппликация указателя довольно проста для понимания. Если у вас есть указатель на первый элемент массива, тогда p + 1 указывает на второй элемент и так далее, независимо от размера каждого элемента. Так что даже если бы у вас был массив ints или произвольная структура 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[1] again 

Если массив неподписанные символ, то вы просто добавить однако количество байтов смещения вы хотите перейти в массив, например,

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

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

+0

p4 не «// тот же, что и данные [1] снова». p4 аналогичен & data [0]. – Fox

0

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