#c #pointers #post-increment #pre-increment
#c #указатели #пост-инкремент #предварительное увеличение
Вопрос:
Здесь, в приведенной ниже программе, указатель ‘c’ не был изменен. Тем не менее, он печатает второй элемент массива вместо первого, то есть ‘a’. Кто-нибудь может объяснить это поведение? Первые два символа напечатаны правильно, но третий — что-то необычное.
#include <stdio.h>
int main()
{
char arr[] = {'a','m','r'};
char *a = arr;
char *b = arr;
char *c = arr;
* a;
*b;
printf("%c %c %c",*a,*b,*c);
return 0;
}
Вывод:
m b b
Комментарии:
1.
*b;
здесь вы увеличиваете содержимое массива.2. Ну, поскольку
c
указывает на то же место,b
что и …
Ответ №1:
char arr[] = {'a','m','r'};
/|
a b c
после * a;
char arr[] = {'a','m','r'};
/ |
b c a
после *b;
char arr[] = {'b','m','r'};
/ |
b c a
Ответ №2:
Изначально a
, b
и c
все указывает на первый элемент массива.
* a;
==> операция увеличивает адрес, поэтому он будет указывать на следующее местоположение и учитывать значение в нем, следовательно, оно будет указывать на следующее местоположение, т.е. m
*b;
==> здесь вы увеличиваете значение, содержащееся в b , т.е. a
, следовательно, после увеличения оно становится b
* c ==> указывает на увеличенное значение предыдущей операции, т.е. b
Ответ №3:
Давайте рассмотрим приоритет и ассоциативность prefix
, postfix
, и *
оператора разыменования.
-
Приоритет:
Postfix
имеет более высокий приоритет, чем* dereference operator
prefix
оператор and . Ноprefix
и* dereference operator
имеют одинаковый приоритет. Мы должны учитывать ассоциативность операторов с одинаковым приоритетом. -
Ассоциативность : справа налево для
prefix
и* dereference operator
. -
Изначально
a
,b
,c
сохраняем адрес первого элемента массива. -
* a
может быть выражено как*( a)
, поскольку ассоциативность справа налево. (Примечание:prefix
и* dereference operator
имеют одинаковый приоритет). -
Следовательно,
*( a)
=*(a 1)
=m
-
Аналогично,
*b
может быть выражено как(*b)
=(a)
=b
(поскольку*b = a
) -
Поскольку значение по первому адресу массива было изменено,
*c
=b
.