Привет ЛОР.
Есть недопонимание того, как работает C (равно как и С++). Проясните, пожалуйста. Собственно код:
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
int main() {
int64_t *p = (int64_t*)malloc(24*sizeof(int64_t));
for(size_t i = 0; i < 24; ++i) {
p[i] = i;
}
int64_t (*p6)[6] = (int64_t (*)[6])p;
printf("%d\n", p6[3]);
printf("%d\n", (*(p6 + 3)));
free(p);
}
$ gcc --std=c11 test.c && ./a.out
13795488
13795488
Собственно, как видим, p6[3] возвращает адрес в памяти. Я не понимаю, почему. Моя логика такова:
- p - адрес в куче, где лежит подряд 24 инта, от 0 до 24.
- p6 - тот же адрес.
- Из-за того, что p6 указатель на int64_t[6], при его индексации сдвиг происходит на 48 байт.
- При взятии индекса должно происходить разыменование, т.е. должно возвращаться значение 4-ых 48 байт, а не их адрес.
- То же верно и для предпоследней строки. p6 + 3 - адрес 4-ых 48 байт.
- *(p6 + 3) должно вернут значение, а не адрес.
Вопрос, почему работают всякие p6[3][2]
?