#c #pointers
#c #указатели
Вопрос:
int b[2], *ptr;
b[0] = 5;
b[1] = 7;
ptr = amp;b[0];
*ptr = 66;
printf("%d", *ptr);
Почему мне разрешено выполнять *ptr = 66
строку, даже если = 66
бит, кажется, ничего не делает? Когда я печатаю *ptr
, это 7. Кто-нибудь может объяснить, почему? Разве компилятор не должен жаловаться на то, что = 66
бит не оказывает эффекта?
*ptr = 66
В принципе не эквивалентно 7 = 66
?
Комментарии:
1.
ptr = amp;b[0];
является избыточным; вы можете использоватьptr=buf
вместо этого.
Ответ №1:
Что происходит, это:
-
b[0]
присваивается значение66
, потому что вы откладываетеptr
, то есть вы делаете*ptr
, а затем выполняете назначение -
Сам указатель увеличивается, т.е.
amp;b[0]
, который становитсяamp;b[1]
-
ptr
теперь указывает наb[1]
, который7
Другими словами: увеличение и присвоение выполняются для двух совершенно разных вещей. И поскольку это постфиксное приращение, указатель увеличивается после того, как его исходный адрес получает новое значение.
Комментарии:
1. Я понимаю, что делает часть кода * ptr , но почему я могу присвоить это выражение числу?
2. @Sam: Вы разыменовываете
ptr
и присваиваете 66 любому значению, которому оно соответствует, но при этом увеличиваете сам указатель.3. Просто для смеха: попробуйте
*( ptr)=99;
Ответ №2:
Вы увеличиваете указатель. После этого он указывает на b[1]. Значение b[0], вероятно, равно 66.
Комментарии:
1. Да, я понимаю это, но почему компилятор позволяет мне присваивать * ptr числу, даже если это не имеет никакого эффекта?
2. 5? Но компилятор не позволяет мне вводить 5 = 7;
Ответ №3:
ptr
Называется post increment, это означает, что вы сначала используете старое значение ptr
(перезаписывая 5
), затем увеличиваете ptr
.
Комментарии:
1. Спасибо! Итак, эквивалентный код в основном * ptr = 66; * ptr ;? Для меня это имеет смысл.
2. На самом деле это не имеет смысла, потому что тогда * ptr было бы 67.
3. Это эквивалент
*ptr = 66; ptr
. Это означает, что вы увеличиваете указатель , а не то, на что он указывает.
Ответ №4:
Вы увеличиваете указатель. Если вы хотите увеличить значение указателя, используйте (*ptr)
.
Смотрите эту таблицу приоритетов