2016-07-21 3 views
3

Пока я учился C (я очень к этому знаком), я играл с указателями. Здесь вы можете увидеть мой код:c: при использовании указателя в качестве входа в функции, увеличивающей значение указателя, с помощью * pointer ++ не работает

#include <stdio.h> 

void change(int *i) 
{ 
    *i += 1; 
} 

int main() 
{ 
    int num = 3; 

    printf("%d\n", num); 
    change(&num); 
    printf("%d\n", num); 

    return 0; 
} 

Моей цель состояла в том, чтобы заменить приращение значения Num без переназначения его следующим образом:

num = change(num); 

Вот почему я проезжал ячейку памяти из num с помощью &: поэтому он может использоваться как указатель. Перед этой версией все в коде было одинаковым. Единственное, что было иначе, это то, что я сказал *i++; вместо того, чтобы сказать *i += 1;

Теперь мой вопрос, почему я не могу сказать *i++?

+8

Приоритет оператора: постфиксное увеличение имеет более высокий приоритет, чем унарное косвенное, имеет более высокий приоритет, чем составное присвоение. – EOF

+0

Быть немецким не является оправданием для плохого английского! – Olaf

+0

@Olaf Ich bin Deutscher и до сих пор проблемы с англичанами. – Michi

ответ

7

Теперь мой вопрос, почему я не могу сказать * я ++

Благодаря оператору старшинства, *i++ такой же, как *(i++).

*(i++); 

эквивалентно:

int* temp = i; // Store the old pointer in a temporary variable. 
i++;   // Increment the pointer 
*temp;   // Dereference the old pointer value, effectively a noop. 

Это не то, что вы хотите. Вам необходимо использовать (*i)++ или ++(*i). Они будут сначала разыменовывать указатель, а затем увеличивать значение объекта, на который указывает указатель.

+0

'* (i ++), что не то, что вы хотите. Это будет полезно для OP, чтобы знать почему. – Michi

+1

@Michi, хорошее предложение. –

2

Это связано с operator precedence.

Вы можете видеть, что «постфиксное приращение» находится на уровне приоритета 1 и «Направление (разыменование)» на уровне 2, а первый уровень - первым. Поэтому вам нужно использовать скобки, чтобы сначала разыскать разницу: (*i)++.

Разница (*i)++ говорит, что указана ячейка памяти, на которую указывает i, и увеличивайте ее (что вам нужно). *(i++) говорит о приращении i (поэтому он указывает на следующий адрес) и разыгрывает это; который, возможно, не-op, а не то, что вы хотите.

+0

'Итак, вам нужно использовать скобки, чтобы сначала было разыменоваться: (* i) ++' Вы могли бы объяснить, что произойдет, если он/она не сделает этого. – Michi