2015-10-01 4 views
-1

Я хотел бы знать, почему argv массив может содержать элементы нескольких символов в следующем коде:аргументы командной строки: ARGV

#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    for (int nArg = 0; nArg < argc; nArg++) 
    { 
    cout << nArg << " " << argv[nArg] << endl; 
    } 

    return 0; 
} 

код просто выводит все аргументы, передаваемые программе.

Когда я запускаю программу с аргументами foo и bar, argv[1] является foo и argv[2] является bar.

Но argv представляет собой массив из char. И foo не char, а строка. Как можно argv[0] быть foo?

+2

ARGV является массив символьных указателей, которые по существу являются способ выражения строк в C. Я бы предложил прочитать книгу C – user3159253

+1

'argv [0]' должно быть именем программы или пустой строкой. – MooseBoys

ответ

2

argv на самом деле указатель, а не массив. В C и C++ параметр функции не может быть массивом. Если он похож на массив, то во время компиляции он «настраивается» как указатель на тип элемента массива.

Это:

int main(int argc, char *argv[]) 

на самом деле означает это:

int main(int argc, char **argv) 

Когда программа запускается, argv будет инициализирован, чтобы указать на char* объекта.Этот объект является исходным элементом массива указателей char*, каждый из которых указывает на (начальный элемент) строки - за исключением того, что последний элемент argv[argc] содержит нулевой указатель.

argv[0] является указателем на строку, которая представляет имя программы. Если программа вызывается с двумя аргументами, то argv[1] и argv[2] укажут на эти аргументы.

И наконец, если вы печатаете значение char* с использованием std::cout << ..., оно будет печатать, а не значение указателя, но значение строки, на которую оно указывает.

Когда я запускаю программу с аргументами foo и bar, argv[0] является foo и argv[1] является bar.

Уверены ли вы в этом? (Update: Это была опечатка в вопросе, который теперь исправлена.) Если ваша программа под названием «my_program», выход my_program foo bar должно быть что-то подобное:

0 my_program 
1 foo 
2 bar 
+0

Это имеет смысл сейчас. Благодарю. Что касается значения 'argv [0]' и 'argv [1]', вы правы - у меня была опечатка в моем вопросе. Редактирование сейчас. –

1

Но argv представляет собой массив из char.

Исправление: это массив из char *. "foo" - char *, так что это работает.

Массив из char is char argv[].
Массив char * - char *argv[]. Это то, что у вас есть.

+1

Исправление: 'argv' является указателем на указатель на' char'. В C или на C++ нет параметров массива; объявление, которое выглядит как параметр массива, «отрегулировано», поэтому оно действительно является указателем на тип элемента. 'char * argv []' действительно означает 'char ** argv'. (Существует требование времени выполнения, которое указывает объект 'char *', который указывает 'argv', - это начальный элемент массива объектов' char * ', каждый из которых указывает на строку.) –

1

ARGV [0] является Foo и ARGV [1] находится бар ...

Следует отметить, что argv[0] всегда получает фактическое имя программы вызывается из оболочки, так что ваши аргументы командной строки запуска от argv[1].

Вы совсем рядом.

0

Но argv представляет собой массив char.

Это не так. Это массив указателей char, и эти указатели указывают на (с нулевым завершением) char массивы, то есть строки в стиле C.

Технически, argv не является массивом, а указателем на массив (массив, содержащий указатели char). См. Комментарий Кита Томпсона к ответу Джона Кугельмана для более подробной информации.

+0

' argv' является указателем , а не массив; см. мой комментарий к ответу Джона Кугельмана. –

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