C арифметика с запутанным указателем - PullRequest
0 голосов
/ 23 ноября 2018

У меня путаница в арифметике указателей Си.Я узнал, что когда я добавляю или вычитаю адрес указателя, он складывается или вычитается с несколькими типами данных.Например:

int *p =90;
p+=1;
printf("%d",p); 

возвращает 94, поскольку 90 + 1 * 4 = 94.

однако следующий код возвращает странный результат.

void set_next_block_size(long long int * current, long long int size){
    *(current+1+size/8)=size;
}

Я угадал значениеin () будет текущим + 8 + размером, так как тип long long int занимает 8 байтов, но на самом деле он вычисляется как current + 1 + size / 8 ..

что такое long?

1 Ответ

0 голосов
/ 23 ноября 2018
void set_next_block_size(long long int * current, long long int size){
    *(current+1+size/8)=size;
}

Я предположил, что значение в () будет текущим + 8 + размер, так как тип long long int занимает 8 байтов, но на самом деле он рассчитывается как текущий + 1 + размер / 8 ..

Вы ошиблись.И из первого фрагмента вы, похоже, знаете правила для арифметики указателей: +1 на самом деле означает «переместить адрес указателя на 1 элемент указанного типа, то есть 4 байта».

Теперь вы хотитеперейти к следующему элементу, и вы хотите использовать размер вместо числа.Почему сейчас должно быть по-другому?

Он по-прежнему работает так же, как и раньше.

Если вы добавите +8, вы добавите 8*sizeof(long long int) байт.Это изменит адрес на 64+size байт, что не то, что вы, кажется, хотите.Вместо этого вы хотите добавить только 1 элемент + size.Вот почему это +1, а не +8

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