Переменные y
и z
являются указателями на целые числа и в этом случае указывают на адрес переменной x.
Следующие строки устанавливают значение y
по адресу x
(т.е.&x
дает вам адрес `x '.
y=&x;
z=y
Следующая строка, *y++=*z++;
точно не имеет смысла и может быть или может не компилироваться в зависимости от используемого компилятора. В случае GCC 4.3.2 он дает следующую ошибку.
foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’)
Похоже, что вы пытаетесь сделать арифметику указателей, но получил приоритет оператора немного перепутали. Вы пытаетесь увеличить значение, указанное z
после присвоения значения предварительного приращения местоположению?
'y' и' z' оба указывают на 'x', поэтому вы присваиваете' x' себе. Затем вы увеличиваете оба указателя. Затем вы вызываете неопределенное поведение, передавая их в 'printf', но используя преобразование'% d', которое ожидает 'int', а не указатели (для печати указателей, их приведение в 'void *' и конвертирование с '% p'). –
@JerryCoffin Я ржавый по этому поводу: это законно даже для того, чтобы заставить их указывать за пределы выделенного пространства? – cnicutar
@cnicutar: Да. Указание одного конца конца массива разрешено до тех пор, пока вы не разыщите указатель и (C99, §6.5.6/7): «Для целей этих операторов указатель на объект, который не является элемент массива ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве его типа элемента. " –