В C ++, как работает выражение "* pointer ++"? - PullRequest
3 голосов
/ 12 декабря 2010
#include <iostream>
using namespace std;

int main () {
    int value = 1, *pointer;
    pointer = &value;
    cout << *pointer++ << endl;
    cout << *pointer << endl;
}

Почему оператор ++ не увеличивает value?

Ответы [ 6 ]

10 голосов
/ 12 декабря 2010

Постинкремент (++) имеет более высокий приоритет, чем разыменование (*). Это означает, что ++ связывается с pointer, а не *pointer.

См. C FAQ 4.3 и ссылки в нем.

7 голосов
/ 13 декабря 2010

Хорошо, все объяснили привязку параметров.
Но никто не упомянул, что это значит.

int    data[1,2,3,4,5];

int*   pointer = data;

std::cout << *pointer++ << std::endl;
std::cout << *pointer   << std::endl;

Как уже упоминалось, оператор ++ имеет более высокий приоритет и, таким образом, связывается сильнее, чем *оператор.Таким образом, выражения также эквивалентны:

std::cout << *(pointer++) << std::endl;
std::cout << *pointer << std::endl;

Но оператор ++ - это постфиксная версия.Это означает, что указатель увеличивается, но результат операции возвращает исходное значение для использования оператором *.Таким образом, мы можем изменить оператор следующим образом:

std::cout << *pointer << std::endl;
pointer++;
std::cout << *pointer << std::endl;

Таким образом, результатом вывода будет целое число, на которое в данный момент указывает, но указатель также увеличивается.Таким образом, напечатанное значение равно

1
2

, а не

2
3
3 голосов
/ 12 декабря 2010

++ имеет более высокий приоритет, чем *, поэтому ваше выражение эквивалентно *(pointer++) - оно разыменовывает значение, а затем увеличивает указатель, а не значение. Если вы хотите увеличить значение, вам нужно сделать (*pointer)++.

2 голосов
/ 12 декабря 2010

Это то же самое, что и

*(pointer++)

, так как он увеличивает адрес, который содержит указатель, , а затем разыменовывает его.

1 голос
/ 12 декабря 2010

*pointer++ означает *(pointer++).

Т.е. он увеличивает указатель, а не указатель.

Один из способов помнить, что это читать оригинальный K & R "Язык программирования C", где их пример strcpy использует это.

во всяком случае, так я помню приоритет.

и так как он увеличивает указатель, ваш второй разыменование имеет неопределенное поведение.

ура и hth.,

0 голосов
/ 12 декабря 2010

Вы увеличиваете значение указателя, а не значение, на которое оно указывает.

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