2016-06-13 6 views
-5

мне было интересно, если кто-нибудь может сказать мне разницу между двумя выражениями: * (PTR + I) и * PTR + я Он используется в коде следующим образом:Указатели! разница между двумя выражениями

char string[]="hello"; 
char *ptr; 
ptr=string; 
for(int i=0;string[i]!='\0';i++) 
{ 
cout<<*(ptr+i); //*ptr+i 
} 
+4

[См 'оператор precedence'] (http://en.cppreference.com/w/cpp/language/operator_precedence) – Rakete1111

+1

' * (PTR + I) 'будет печатать символ в смещении 'i' из указателя местоположения памяти на' ptr' AND '* ptr + i' будет увеличивать значение в ячейке памяти, на которую указывает' ptr', на i. Кроме того, неправильное условие прерывания цикла. Он должен быть 'string [i]! = '\ 0''. – Arunmu

+0

Я все еще не понимаю. Сделайте это проще, пожалуйста! @Arunmu –

ответ

0

Давайте что у вас есть массив из 3 целых чисел со значениями 150, 200 и 250. в памяти, этот массив будет выглядеть следующим образом:

+----------+----------+----------+--- 
| 96000000 | c8000000 | fa000000 |... 
+----------+----------+----------+--- 
| aka 150 | aka 200 | aka 250 |... 
+----------+----------+----------+--- 
a   (a+1)  (a+2) 

Теперь, вы не имеете дело с массивом целых чисел здесь, но целые несколько проще продемонстрировать.

Указатели и массивы в значительной степени взаимозаменяемы в C/C++, поэтому в приведенном выше примере подумайте о a как указатель. Уже это означает, что string и ptr по существу являются одной и той же переменной.

С учетом этого разница между *(pointer+i) и *pointer+1 - это то, к чему применяется 1. В первом случае это адрес указателя. Во втором случае это значение указывает на указатель. Чтобы продолжить приведенном выше примере:

int x = *a+1; // x is 151 
int y = *(a+1); // y is 200 
int z = *(a+1)+1; // z is 201 
Смежные вопросы