Вопрос: У меня определен указатель на 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, и к нему применимы присваивание и инкремент.
-- Кодт
Автор: Кодт    Оценить