2013-07-23 4 views
1

Мой курс CS проходит немного от Java до C. Я сейчас занят переходом указателей, и я столкнулся с тем, что оператор ++ для увеличения не работает, когда разыменования. Это скорее вопрос любопытства, чем что-либо еще. Просто пока не привык к концепции указателей. Я просто делаю что-то неправильно или это что-то связано с указателями?++ Оператор по указателям

Например:

*pointer++; Will not increment the value. 
*pointer+=1; Will increment the value. 

Заранее спасибо!

ответ

3
*pointer++; 

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

*(pointer++); // pointer is incremented 

и не

(*pointer)++; // pointee is incremented 
+0

Спасибо, это имеет большой смысл. – nickcorin

2

*pointer++; почти эквивалентно:

*pointer; 
pointer = pointer + 1; 

Почему его так?

В выражении *pointer++;, ++ это постфиксный оператор, поэтому кулак * операции почтительность выполняется, то значение приращения ++ из pointer (а не увеличивает значение).

В то время как *pointer += 1 просто эквивалентно:

*pointer = *pointer + 1; 

, что приращение значения, на который указывает pointer.

4

Если вы хотите увеличить значение, вы должны убедиться, что используете скобки.

(*pointer)++; 
2

*pointer++pointer увеличивает переменную, а не значения, указанного ею.

int array[4] = {1,2,3,4}; 

int *pointer = array; 

// *pointer equals 1 

*pointer++; 

// *pointer now equals 2 
+1

Это объясняет идею действительно красиво, спасибо! – nickcorin

+0

принимайте ответ, если вам это нравится. – Jiminion

+0

Спасибо за редактирование. Код с двойным интервалом? – Jiminion

2

Это связано с приоритетом операторов: после приращения ++ имеет более высокий приоритет, чем разыменованием оператор *, а += имеет более низкий приоритет in the table of operator precedences. Поэтому в первом примере к указателю, который разыменован впоследствии, применяется ++, тогда как во втором примере += 1 применяется к результату разыменования.

+1

Я заметил поздно, но вы поняли очень красиво концептуально! ... Мне очень нравится ваш ответ. –

Смежные вопросы