Есть некие аргументы командной строки.
И есть выражение *++argv. написано, что это указатель на аргумент-строку.
А (*++argv)[0] это первый символ, и это эквивалентно **++argv.
Объясните пожалуйста логику этих выражений.
И пару вопросов.
1. *++argv почему это указатель? Если * означает разыменование.
2. (*++argv) [0] - зачем тут ++, если сколько не плюсуй, [0] будет указывать на первый элемент, то есть на само название программы.
argv - указатель определенного типа.
++ - оператор Pre-increment, для указателей делает увеличение на размер типа указателя.
* - оператор разыменования. Получение значения из памяти куда нацелен указатель.
[0] - оператор получения значения по индексу, для массивов.
Вам приходит указатель на массив значений командной строки, значения это строки.
++argv - указывает на начало второго значения из коммандной строки.
а [0] на первой символ этого значения.
Значит *++argv это является не указателем, а значением, на которое указывает указатель с учетом уже перемещения?
(*++argv) [0] А это выражение как прочесть?
Александр, (*++argv) [0] - сместить указатель на следующую ячейку, провести разыменование этой ячейки, взять первый элемент по адресу в этой ячейке. argv имеет тип const char* const argv[]. В ячейках argv лежат элементы типа const char* const, для которых тоже характерны операторы разыменования и произвольного доступа.
Петр, значит argv это не просто указатель на массив из значений.
Это указатель на массив из указателей на строки!?
Тогда в чем разница между *++argv или ++argv?
Александр, первое возвращает значение, находящееся по адресу, следующему после записанного адреса в argv; второе - адрес, следующий после записанного адреса в argv.
Александр, да, *++argv возвращает значение по указателю ++argv, которое в свою очередь также является адресом в памяти и указывает на нулевой элемент некоторого массива.