#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 раз быстрее в некоторых ситуациях (потому что код не проверяет, выровнены ли указатели).