Указатель на массив указателей на массив char - PullRequest
0 голосов
/ 14 июля 2020

В настоящее время я изучаю C ++, используя Accelerated C ++ от Koenig, и у меня есть несколько проблем с указателем на исходный массив указателей. В книге говорится, что следующий код


int main(int argc, char** argv)
{
    // if there are arguments, write them
    if (argc > 1) {
       int i; // declare i outside the for because we need it after the loop finishes
    for (i = 1; i < argc-1; ++i)
       // write all but the last entry and a space
      cout << argv[i] << " ";
     // argv[i] is a char*
      cout << argv[i] << endl;
    }
    return 0;
}

при запуске с аргументами «Hello, world» вызовет Hello World, но если argv является указателем на массив указателей, то не должно argv[i] быть указателем на массив из char, вывод которого является адресом памяти вместо самого массива?

Ответы [ 3 ]

4 голосов
/ 14 июля 2020

A char* - это «C -строка» - так строки представлены на языке C. std::cout знает, как печатать char*, потому что оператор << перегружен реализацией.

C ++ также имеет тип std::string, который является другим способом представления строк.

0 голосов
/ 14 июля 2020

Вы не можете использовать argv как массив, если вы хотите получить доступ к массиву, который находится за этим указателем, вы должны разыменовать его и использовать что-то вроде argv + i.

0 голосов
/ 14 июля 2020

char** argv совпадает с char* argv[]

переменная, ссылающаяся на массив в C ++, является просто указателем на его первый элемент.

argv в основном представляет собой массив c -strings, которые являются массивами символов.

arg c сообщает вам количество c -strings, на которые указывает argv.

, вам не нужно знать, как долго c -strings (char []) потому что они заканчиваются нулем. Он просто будет читать строку char по char, начиная с этого начального адреса памяти, пока не достигнет нулевого терминатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...