Почему индекс типа char ** дает всю строку? - PullRequest
0 голосов
/ 11 июля 2020

Рассмотрим этот фрагмент:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    char c[] = {'a','b','c','\0'};
    char *pc = c;
    char **ppc = &pc;
    cout << ppc[0] << endl;
}

Это выводит abc в качестве вывода. Почему индекс указателя на указатель на char возвращает всю строку? Здесь ppc указывает только на другой указатель, который указывает на единственный char. Как он узнает обо всей строке и зачем ее возвращать?

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Вы должны понимать, что такое std::cout и почему он обрабатывает char* как «строку».

Начнем:

std::cout - это экземпляр * У 1008 * и std::ostream много операторов. Что это значит?

Реализация std::ostream может, но здесь только в качестве примера, написанного как:

 class ostream
 {
     // ... a lot more code for constructors and others
     ostream& operator <<( const int );
     ostream& operator <<( const double );
     ostream& operator <<( char* );        <<< this is the implementation you search for!
     // a long list of more special overloads follow
 };

И реализация просто выводит "строку", char * указывает на.

То, что вы видите, - это просто специальная перегрузка operator<< для класса std::ostream.

Хорошо, в реальной реализации используется перегрузка, не являющаяся членом, но это не важно для понимания принципа работы std::ostream.

Подробнее см .: std :: ostream :: operator << () </a>

Символьные и символьные аргументы строки (например, типа char или const char *) обрабатываются перегрузками оператора <<, не являющимися членами. Попытка вывести символ с использованием синтаксиса вызова функции-члена (например, std :: cout.operator << ('c');) вызовет одну из перегрузок (2-4) и выведет числовое значение. Попытка вывести символьную строку с использованием синтаксиса вызова функции-члена вызовет перегрузку (7) и вместо этого напечатает значение указателя. </p>

1 голос
/ 11 июля 2020

Это эквивалентно:

cout << ppc[0] << endl;
cout << *( ppc + 0 ) << endl;
cout << *ppc << endl;
cout << *(&pc) << endl;
cout << pc << endl;
...