В чем разница между * a и *b?

#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 , и * оператора разыменования.

  1. Приоритет: Postfix имеет более высокий приоритет, чем * dereference operator prefix оператор and . Но prefix и * dereference operator имеют одинаковый приоритет. Мы должны учитывать ассоциативность операторов с одинаковым приоритетом.

  2. Ассоциативность : справа налево для prefix и * dereference operator .

  3. Изначально a , b , c сохраняем адрес первого элемента массива.

  4. * a может быть выражено как *( a) , поскольку ассоциативность справа налево. (Примечание: prefix и * dereference operator имеют одинаковый приоритет).

  5. Следовательно, *( a) = *(a 1) = m

  6. Аналогично, *b может быть выражено как (*b) = (a) = b (поскольку *b = a )

  7. Поскольку значение по первому адресу массива было изменено, *c = b .