Вопрос: У меня определен указатель на char, который указывает еще и на int, причем мне необходимо переходить к следующему элементу типа int.
Почему
((int *)p)++;
не работает?
Ответ:
В языке С оператор преобразования типа не означает "будем действовать так, как будто эти биты имеют другой тип"; это оператор, который действительно выполняет преобразования, причем по определению получается значение типа rvalue, которому нельзя присвоить новое значение и к которому не применим оператор ++. (Следует считать аномалией то, что компиляторы pcc и расширения gcc вообще воспринимают выражения приведенного выше типа.).
Скажите то, что думаете:
p = (char *)((int *)p + 1);
или просто
p += sizeof(int);
Смотри:
ANSI Разд.3.3.4;
Rationale Разд.3.3.2.4 c. 43.
Примечание:
Ещё можно сделать то же самое через указатель на указатель
(*(int**)(&p))++;
поскольку результат разыменования — это lvalue, и к нему применимы присваивание и инкремент.
-- Кодт