2016-07-28 10 views
-5

Я довольно новичок в C, и иногда я встречаю странные обозначения, особенно по отношению к указателям.Каким оператором является * (++ ptr)?

очень короткий пример:

.... 
real *ptr; 
real delta_force; 
for(i<particles;...) 
{ 
    ...some calculations 
    ptr=&FORCE(i,...); //FORCE is a macro returning the current force on a particle 
    *(++ptr) += delta_force; 
    ... 
} 
... 

Как я могу интерпретировать *(++ptr)?

+2

Это то же самое, что и '++ ptr; * PTR; '. Увеличьте затем разыменование. – Cornstalks

+2

Знаете ли вы, что такое '++ ptr'? И что такое унарный '' '? Теперь объедините их. –

+0

Вы когда-нибудь слышали что-то о [разыменовании указателя] (http://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer-mean). – LPs

ответ

8

Указатель первого инкремента, а затем добавьте delta_force к значению, на которое указывает указатель.

*(++ptr) += delta_force; 

означает то же самое, как

ptr = ptr + 1; 
*ptr = *ptr + delta_force; 
+0

получил его, спасибо большое –

+1

Примечание: 'ptr' оценивается один раз с помощью' * (++ ptr) 'довольно дополнительных времен с другим« эквивалентным »кодом. Может иметь значение, если 'ptr' будет чем-то более сложным, чем простой объект/указатель, в отличие от' real * ptr' OP. – chux

+0

еще раз спасибо. на самом деле ptr указывает на Force-Vector, где к компонентам обращаются посредством приращения, так что * (ptr) соответствует x-компоненте, а * (++ ptr) является y-компонентой и т. д. ... –

1

Это сочетание приращению оператора ++ и указатель разыменования нотации *

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

В итоге: вы собираетесь к следующему указателю

+0

Ну, '* (ptr ++) + = delta_force' также переходит к следующему указателю, но не делает то же самое, что' * (++ ptr) + = delta_force'. В этом вопросе вы переходите к следующему указателю, прежде чем выполнять другие операции, присутствующие на линии. В том, что я дал в начале этого комментария, вы переходите к следующему указателю после выполнения других операций на линии. – HolyDanna

+0

Вы правы. Я отредактировал, чтобы было более ясно, что я сказал. – mk2

+0

получил его, спасибо большое –

2

Прочти изнутри. *(++ptr) += somevalue равно следующий код

++ptr; //increases the Pointer by the sizeof(real) 
real v = *ptr; // dereferences the Pointer and assigns the value it is pointing to to v 
v = v + somevalue; // increases v by somevalue 
*ptr = v; // assigns the new value of v to the target of ptr 
+0

получил его, спасибо большое –

1

на указатели в языке программирования C .... (*) означает «значение по адресу в»

и здесь указатель PTR содержит адрес из FORCE макроса так сначала адрес будет увеличен, тогда значение в адресе ptr будет обновлено до нового значения во время каждой итерации цикла ...

+0

получил его, спасибо большое –

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

  • Нет связанных вопросов^_^