Может кто-то прояснить неправильную интерпретацию с моей стороны? Я знаю, что мое понимание неверно из-за результата моего кода (см. Нижнюю часть вопроса). Спасибо заранее.Разница в значениях между доступом указателя и доступом к массиву
Чтобы уточнить, что делает каждый сегмент следующей строки означают ?:
*(u8 *)((u32)BufferAddress + (u32)i)
И как же она отличается от следующей строки:
*(u32 *)((u32)BufferAddress + (u32)i)
Моя интерпретация выше:
- segment1 = ((u32) BufferAddress + (u32) i) => определить адрес как целое.
- segment2 = (u32 *) (segment1) => указать адрес, который будет обрабатываться как указатель, где указатель имеет длину 32 бита.
- segment3 = * (segment2) => разыменовать указатель, чтобы получить значение для проживания по вычисленному адресу.
Что является неправильным в моей интерпретации? Я думаю, что мое отсутствие понимания находится в области сегмента2 ... В чем разница между кастингом (u32 *) и (u8 *)?
Вот код, который заставил меня понять, у меня есть знания запрещенную:
инициализации код:
main(...) {
...
u8 *Buffer = malloc(256);
...
Buffer[0] = 1;
Buffer[1] = 0;
Buffer[2] = 0;
Buffer[3] = 4;
Buffer[4] = 0;
Buffer[5] = 0;
qFunction(... , Buffer, 6, ...);
...
}
qFunction(... , const u8 *BufferPointer, u32 BufferLength, ...) {
u32 BufferAddress;
...
BufferAddress = (u32) BufferPointer;
...
/* Method 1: */
for (i=0; i < BufferLength; i++)
printf("%d, %p\n", BufferPointer[i], &BufferPointer[i]);
/* Method 2: */
for (i=0; i < BufferLength; i++)
printf("%d, 0x%lx\n", *(u8 *)(BufferAddress+i), BufferAddress+i);
/* Method 3: */
for (i=0; i < BufferLength; i++)
printf("%d, 0x%lx\n", *(u32 *)(BufferAddress+i), BufferAddress+i);
...
}
Выходы Метод 1 и метод 2, как я ожидаю (оба то же самое):
1, 0x1000000
0, 0x1000001
0, 0x1000002
4, 0x1000003
0, 0x1000004
0, 0x1000005
Однако выход метода 3 кажется мне странным; только часть результата такая же, как и метод 1/2:
-1442840511, 0x1000000
11141120, 0x1000001
43520, 0x1000002
4, 0x1000003
0, 0x1000004
0, 0x1000005
Буду признателен за любые советы или ссылки на материалы для чтения. Спасибо.
Ответы macduff верны, но один комментарий добавить; вы должны стараться избегать приведения указателей на целые числа, если это возможно, поскольку это не является действительно необходимым и вызовет проблемы, если вы когда-нибудь решите построить в 64-битных в будущем (указатели будут 64 бита, а не 32). –