On Sun, Feb 24, 2019 at 02:06:56PM +0300, Mikhail Efremov wrote: > On Sat, 23 Feb 2019 15:55:21 +0300 Alexey V. Vissarionov wrote: > > On 2019-02-23 15:28:44 +0300, Leonid Krivoshein wrote: > > > > >>> void-указателями такого не проделаешь, в отличие от gcc, который > > >>> тоже >>> ни один стандарт могёт. > > >> Я не понял этой фразы и сравнения указателей с gcc. При чем тут > > >> указатель на void? Размер объекта в этом случае не известен, > > >> разумеется арифметика не работает. > > > > Арихметика работает независимо от. Например, конструкцию вида > > > > void *x; int y = x[1]; > > > > компилятор пошлет по азимуту, и правильно сделает. Но при этом > > > > void *x; int y = x+123; > > > > не вызовет у компилятора никаких эмоций и превратится (на писюшатине) > > в самый обычный lea. Почему? Потому что это обычное сложение, а как > > потом будет использоваться результат - уже забота не компилятора, а > > программиста. > > > > Если что, я такие конструкции регулярно использую, когда пишу для > > контроллеров. > > Ну, я видимо не использовал, поэтому не помню, спасибо. > Вообще логично, до того как в языке появился void * обычно использовали > char * для этих целей. Это gcc extension, причём довольно старый. https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/Pointer-Arith.html https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC78 -- ldv