2013-06-02 4 views
4
int array[10];    
int main (){ 
    int *data_ptr; 
    int value; 

    data_ptr = &array[0]; 

    value = *data_ptr++;   
    value = *++data_ptr;   
    value = ++*data_ptr; 

    return 0; 
} 

В чем разница между каждым заданием?Разница между указателями

Если я печатаю после каждого задания значения возвращает

0 

0 

1 
+0

http://web.ics.purdue.edu/~cs240/misc/operators.html – kfsone

ответ

4
value = *data_ptr++; 

Это присваивает результат разыменования data_ptr к value, а затем увеличивает data_ptr. Таким образом, первый элемент массива, который равен 0, будет находиться в value, а data_ptr будет указывать на второй. Это связано с тем, что ++ имеет более высокий приоритет, так что он применяется к data_ptr, а не к *data_ptr.

value = *++data_ptr; 

Это первое приращение data_ptr (так что указывает на третий элемент массива вместо второй, в данном случае), и затем сохраняет результат разыменовании, что (то есть, третий элемент массива, который также равен 0) в value.

value = ++*data_ptr; 

Это сохраняет результат разыменования data_ptr (третий элемент массива) + 1 (так, 1 в целом, так как все элементы вашего массива автоматически инициализируются 0 в этом случае) в value.

+0

Спасибо, что ответили. Теперь это яснее. –

0

хорошо

// Increment data_ptr and return the *original* value, then dereference that. 
value = *data_ptr++; 
// Increment data_ptr and return the new value, then dereference that 
value = *++data_ptr; 
// Dereference data_ptr then increment the result and return 
// the newly incremented value. 
value = ++*data_ptr; 

Чтобы сделать это ясно, вот то же самое выписал длинная рука

//1 
data_ptr+=1; 
int* prev = data_ptr - 1; 
value = *prev; 
//2 
data_ptr += 1; 
value = *data_ptr; 
//3 
value = *data_ptr; 
value+=1; 
+0

'// 1' больше' value = * data_ptr; data_ptr + = 1; '... –

+0

Post- оператор increment делает копию, но да, оба работают. – jozefg

0

выглядит правильно мне. Глобальный array[] инициализируется нулями. Первый value = *data_ptr получает значение [0], а затем увеличивает указатель. Следующая строка снова увеличивает указатель и получает [2]. Последняя линия получает [2], а затем увеличивает значение, давая 1.