C - Почему мне разрешено это делать? - PullRequest
3 голосов
/ 10 апреля 2011
int b[2], *ptr;
b[0] = 5;
b[1] = 7;

ptr = &b[0];
*ptr++ = 66;

printf("%d", *ptr);

Почему мне разрешено делать строку *ptr++ = 66, хотя бит = 66, похоже, ничего не делает? Когда я печатаю *ptr, это 7. Кто-нибудь может объяснить, почему? Разве компилятор не должен жаловаться, что бит = 66 не дает эффекта?

Не является ли *ptr++ = 66 в основном эквивалентным 7 = 66?

Ответы [ 4 ]

6 голосов
/ 10 апреля 2011

Происходит следующее:

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

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

  3. ptr теперь указывает наb[1], то есть 7

Другими словами: приращение и присваивание выполняются для двух совершенно разных вещей.И так как это постфиксный инкремент, указатель увеличивается после его первоначальный адрес получает новое значение.

2 голосов
/ 10 апреля 2011

Вы увеличиваете указатель.Это указывает на b [1] после этого.Значение b [0], вероятно, равно 66.

1 голос
/ 10 апреля 2011

Вы увеличиваете указатель. Если вы хотите увеличить значение указателя, используйте (*ptr)++.

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

1 голос
/ 10 апреля 2011

ptr++ называется постинкремент , это означает, что вы сначала используете старое значение ptr (перезаписываете 5), затем увеличиваете ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...