Я столкнулся с некоторым кодом, который использовал оба эти, казалось бы, взаимозаменяемые.Разница между литьем (char *) и * (char **) в C (реализация malloc)
Я дам пример проблемы, что я запутались:
Скажем, у меня есть некоторые данные в дважды связанный список, и я хочу, чтобы изменить некоторые символы/адреса в блоке. Итак, мы имеем:
void* ptr; //points to beginning of block
void* prevPtr; //prev item in LL
void* nextPtr; //next item in LL
*((char *)ptr) = prevPtr;
*(*(char **)(ptr) + sizeof(char*)) = nextPtr;
В этом примере, в чем разница между двумя нижними линиями (кроме явно движется к месторасположению nextPtr
«s в памяти)?
Так, чтобы уточнить, значение 'ptr' - это некоторый 8-байтовый адрес памяти. Я пишу в адрес памяти в местоположении 'ptr', а затем записываю в адрес памяти в месте расположения' ptr + sizeof (char *) '. – kzs
@kzs в этом случае 'ptr' всегда следует интерпретировать как указатель на 8-байтовый адрес памяти, а не как указатель на' char'. – JAB
Важно признать, что в каждом случае символ * 'char' * по указанному адресу обновляется значением указателя. Это задание почти наверняка переполняется (без изменения любого другого, кроме указанного байта). В любом случае результат не может быть тем, что было предназначено. –