C — Почему мне разрешено это делать?

#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:

Что происходит, это:

  1. b[0] присваивается значение 66 , потому что вы откладываете ptr , то есть вы делаете *ptr , а затем выполняете назначение

  2. Сам указатель увеличивается, т.е. amp;b[0] , который становится amp;b[1]

  3. 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) .

Смотрите эту таблицу приоритетов