2016-10-21 2 views
0

Я понимаю, что такое указатель, но для символов и строк это очень смущает меня. У меня есть я кусок кода, как показано ниже:& оператор не создает адреса символов

#include <iostream> 

using namespace std; 

int main() 
{ 
    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 

    cout << "Address of 'H' is: "; // line 1 
    cout << &greeting << endl;  // line 2 
    cout << "Address of 'e' is: "; // line 3 
    cout << &(greeting[1]) << endl;// line 4 
    cout << "Address of 'l' is: "; // line 5 
    cout << &(greeting[2]) << endl;// line 6 

    return 0; 
} 

и выход:

Address of 'H' is: 0x7fff30f13600 
Address of 'e' is: ello 
Address of 'l' is: llo 

Может кто-то помочь мне объяснить, почему line 4 и line 6 не производит адрес?

+4

Потому что cout << char * специализирован ... вы хотите отдать его в пустоту *, если вы хотите адрес – UKMonkey

+0

Почему вы думаете, что '' Адрес 'H': "' будет печатать строку, но ' & (приветствие [1]) 'не будет? Подумайте, какие они есть. – Simple

+0

попробуйте 'cout << & greeting << & greeting [0]' и посмотрите. И [не используйте 'endl', если вы действительно не хотите его поведения] (http://stackoverflow.com/q/213907/995714), используйте' '\ n'' вместо –

ответ

2

Это не имеет никакого отношения к адресу-оператору & в этом случае.

Оператор

std::ostream& operator<<(std::ostream&, const char*); 

является специализированной перегрузкой для вывода завершенного нуль C-строка.

Если вы хотите, чтобы напечатать адрес, использовать оттенок void*:

cout << (void*)&greeting[1] << endl; 
+0

Или добавьте в' uintptr_t'. – Lundin

+0

Можете ли вы объяснить причину этого? – user2671755

+1

@ user2671755 Причина в том, что C++ предполагает, что символ «char *» относится к строке, которую вы хотите распечатать. Это особый случай для этого типа указателя. – Lundin

0

Поскольку строки на самом деле charachter массивы.

при печати соиЬ < < приветствий

это эквивалент соиЬ < < & (привет [0])

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

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