Я просматриваю код C и хочу знать, правильно ли я понял код.Тип Указатель на литье в C
Существует структура, BF_salt определена в заголовочном файле, как показано ниже:
typedef
{
BF_WORD salt[4];
..
..
} BF_SALT;
В основном C Кодекса, есть вызов функции:
function func1()
{
static BF_SALT salt;
func2(salt.salt,x,y);
....
}
func2(BF_WORD * dst,x,y)
{
unsigned char * dptr= (unsigned char*)dst;
int c1,c2;
// c1 and c2 are initialized here.
// in a loop, an operation similar to the below is performed.
*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
}
Мое понимание приведенный выше код:
в func1, соль определяется с типом данных структуры BF_SALT.
Мы вызываем func2, передавая соленое поле структуры.
поле соль представляет собой массив из 4 элементов, каждый из типов данных BF_WORD (32 битного слова или 4 байта)
в func2
целевой_адрес это имя массива, который указывает на элемент тип BF_WORD.
Выполняет это приведение по указа + ст.
В настоящее время dst указывает на тип данных BF_WORD. это тип casted, так что он указывает на char (1 байт данных).
теперь он выполняет операции битбой по целым числам c1 и c2 и записывает вывод в адрес памяти, указанный dptr. Таким образом, это переписывание данных, на которые первоначально указывалось dst (байты в массиве солей).
c1 и c2 имеют тип данных int, что требует 4 байтов пространства.
Каким образом dptr перезапишет содержимое массива? Поскольку каждый раз мы делаем * dptr ++, мы продвигаем указатель, dptr на 1 байт, потому что он указывает на символ.
Однако мы присваиваем ему значение размером более 1 байт. Как данные будут записаны в память?
Спасибо.
"* Следовательно, результат 4 байта записывается в соль [0], на которую указывает dptr ... *", но только младший байт присваивается тому, что указывает 'dptr', так как это' unsigned char * '! И: Какой «* ... следующий побитовый результат. *», Пожалуйста? Я не вижу петли. – alk
@alk Да, я подумал об этом, младший байт назначен, если его неявно typecasted и, следовательно, более высокие 3 байта усечены, , но я думаю, что неявное typecasting occours только, если назначение левой руки является переменной типа данных, а не указателем , Поправьте меня, если я ошибаюсь –
Слева находится ** указатель ** разыменованный **. Пожалуйста, см. Ответ * Leushenko *, так как он был так добр, чтобы найти стандарт. – alk