Нужна помощь в понимании указателей в данном коде

#pointers

#указатели

Вопрос:

 FBYTE *d = (FBYTE*) dst; 
const FBYTE *s = (const FBYTE*) src;
 while(cnt >= sizeof(int)) {
                *(int*) d = *(int*) s;
                 d  = sizeof(int);
                 s  = sizeof(int);
                 cnt -= sizeof(int);
        }
  

Я новичок в программировании на C, и я не могу понять, как работает 4-я строка кода

      *(int*) d = *(int*) s; 
  

Любая помощь будет оценена.

Комментарии:

1. Это просто абсурдно сложный и ужасно медленный способ копирования данных вместо вызова memcpy. На некоторых мобильных устройствах это будет работать ужасно медленно.

Ответ №1:

Весь этот фрагмент кода посвящен копированию буфера в src dst . while Цикл повторяется src , и на каждой итерации копирует один int .

Давайте рассмотрим правую часть 4-й строки:

  • s это указатель на область исходной памяти, которую вы хотите скопировать.
  • первый cast ( (int *)s ) означает обработку его как указателя на int
  • Почтение перед ним ( * (int *)s ) означает, что принимает значение, на которое указывает точка.

То же самое относится и к левой части выражения.

Итак, по сути, вы перебираете src буфер и на каждой итерации копируете значение текущего int значения dst .

Ответ №2:

Скобки имеют приоритет, поэтому вы приводите их к указателю типа int, а затем извлекаете значение (разыменование), на которое указывает этот указатель s, и копируете его туда, куда указывает d .

Ответ №3:

d — это указатель. Он объявлен указателем на «FBYTE», каким бы ни был FBYTE — программисту, пишущему это, нужно дать пощечину, поскольку char * или unsigned char * отлично справились бы с этой задачей.

(int *)d — это тот же указатель, но компилятору сообщается, что это указатель на int .

Если у вас есть указатель int* p , то присваивание p = 5, например, присваивает число 5 значению int, на которое указывает p . Здесь (int) d является указателем на int , поэтому мы также пишем * перед ним, а * (int *)d = whatever присваивает «whatever» int, на который указывает этот указатель.

Итак, что делает вся строка: возьмите указатели. Представьте, что это указатель на int, а не указатель на FBYTE. Прочитайте значение int, на которое оно указывает. Возьмите указатель d. Представьте, что это указатель на int, а не указатель на FBYTE. Запишите int, который вы только что прочитали, в int, на который указывает d .

Подобный код не должен быть написан. Это наглядный пример того, как кто-то пытается быть умным и терпит неудачу. Если вы хотите скопировать данные, вызовите memcpy или memmove . Они скопируют данные, вероятно, в десять раз быстрее. В этом случае на iPhone memcpy может быть в 1000 раз быстрее в некоторых ситуациях (потому что код не проверяет, выровнены ли указатели).