2016-03-19 1 views
1

Я изучаю основы обучения C++, но продолжаю ударяться о стену, пытаясь расшифровать следующее о символах и указателях. Включены комментарии к линиям, дающие мое текущее понимание того, что происходит. Учитывая, что у меня есть код, как показано ниже:Почему печать символа * дает строку, а не адрес?

using namespace std; 
    int main() 
    { 
      //String literal is an array of chars 
      //Array address gets assigned to a ptr of char 
      char myletters[] = {'h','i'}; 
      char* lp = myletters; 
      cout << *lp << endl; 

      //Logically equivalent to above statements 
      char* letters2 = "hi"; 
      cout << *letters2 << endl; 

      //String literal turns into array of chars 
      //Array of chars gets assigned to a ptr of chars 
      //Each ptr of chars gets stored into letters array 
      char* letters[] = {"hi","hello"}; 
      cout << *letters << endl; 
    } 

Мой вывод будет:

h 
h 
hi 

Мой вопрос: когда я использую окончательный COUT напечатать содержимое * письма, почему я получаю строка «привет», а не адрес «привет» или адрес первого символа в «привет»? Я получаю, что первые использования cout печатают char, и что последний cout печатает char *, но мне все еще интересно, почему он печатает полную строку, а не адрес, как я обычно ожидал бы от указателя.

Благодарим вас.

+0

Существует специальная перегрузка для 'operator <<()' с 'char *'. –

+1

@ πάνταῥεῖ Вы должны сделать ответ, потому что это * ответ *. – BrainStone

+0

Все строковые функции работают со строковыми указателями. Если вам нужна ячейка памяти, то указатель на длинную __ (длинную) строкуPtr__ –

ответ

0

Оператор << имеет специальное определение для char*, которое печатает C-строку, на которую он ссылается.

В вашем случае, *letters имеет char* тип (будучи буквы а char*[], так же, как char**) и не char, как *lp есть.

+1

Я бы добавил, что для печати адреса вам нужно просто наложить на 'void *', чтобы перегрузка для 'const char *' больше не использовалась: 'cout << static_cast (* letters) << endl; ' –

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