2010-09-06 4 views
1

Если я объявляю следующие переменные:Принимая адрес указателя

int array[10] = { 34, 43,12, 67, 34, 43,26, 98, 423,1 }; 
int * p = array; 

Затем этот цикл:

for (int i = 0; i < 10; i++) 
{ 
    std::cout << &*p++ << " "; 
} 

дает мне другой вывод (другой набор адресов), к этому коду :

for (int i = 0; i < 10; i++) 
{ 
    std::cout << p++ << " "; 
} 

Почему? Разве они не семантически эквивалентны?

EDIT:

Ну, мои извинения всем, кто ответил на этот один, я не исходный код, это был тест, который я сделал у себя дома, и получается, что я удалил этот код из моего проект. (моя широкополосная связь еще не подключена, поэтому я подождал, пока я не приступим к работе, чтобы опубликовать это). В любом случае - я уверен, что забыл инициализировать p. Но вопрос «разве они не семантически эквивалентны?» был дан ответ. Благодарю.

+2

Я думаю, что это связано с приоритетом операторов. Что произойдет, если вы добавите скобки? –

+1

Опубликуйте также результат и точный код. Я думаю, вам нужно будет повторно инициализировать 'p' в качестве плаката. – dirkgently

+0

@ dirkgently - его возможно - мой оригинальный код находится у вас дома. о нет, я мог бы разместить здесь вопрос о даффе. uh - ой. – BeeBand

ответ

13
int array[10] = { 34, 43,12, 67, 34, 43,26, 98, 423,1 }; 
int * p = array; 

for (int i = 0; i < 10; i++) 
{ 
    std::cout << p++ << " "; 
} 
p = array; 
std::cout << '\n'; 
for (int i = 0; i < 10; i++) 
{ 
    std::cout << &*p++ << " "; 
} 
std::cout << '\n'; 

дает мне то же самое адреса. Вы случайно забыли p = array; между ними?

-1

Порядок приоритета - сначала «++», затем «*» и, наконец, «&».

Таким образом, p++ выдает адрес array[0] и &*p++ с первым приращением p, но это постфикс! Таким образом, значение р (а не величина р + 1) будет дано *, а затем &, таким образом, они являются такими же

Пример:

std::cout << p << std::endl; // Output the adress of p 
std::cout << &*p++<<std::endl; // p is increment but it is postfix, so value of p is used and printed 
std::cout << &*++p<<std::endl; // p has been increment before and is then incremented again 
std::cout << p++ << std::endl; // p has been incremented before, but here p is used first, then incremented 
+2

-1: Приоритет определяет привязку операторов, а не порядок оценки. Postfix '++' всегда получает последний результат, поэтому '& * p ++' должен быть эквивалентен '& * p', за которым следует' p ++ '. –

+0

Я думаю, что '++' будет оцениваться первым. –

+1

Нет, это не так. В этом все дело в том, что унарные операторы префикса и постфикса! –

4

Если вы не забудете сбросить p перед вторым циклом, они дают тот же результат.

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