2016-01-21 2 views
0

Я изучаю C++, и одна вещь, которую я, похоже, не могу найти, объясняет, как работает char * argv []. Я понимаю, что это массив символов, но от того, что я понимаю, если у васПочему argv [1] целое слово и ни одна буква?

char myword[] = "Hello"; 

затем MyWord [1] является «е».

Значит, при использовании argv [], почему argv [1] весь первый аргумент, а не только вторая буква названия программы? Есть кое-что здесь, я не понимаю, но я не уверен, что ....

Спасибо за любые объяснения!

ответ

1

Вы, кажется, упускает то, что ARGV (как в int main(int argc, char* argv[])) является указателем для указателя на char, а не на char.

Некоторые смешные вещи о массивах и указатели. Так как указатель можно обрабатывать в массиве (при условии, что он указывает на массив), а массивы можно рассматривать как указатели (технический термин для этого - распад для указателей) массив и указатель могут часто использоваться взаимозависимо.

Однако, при этом необходимо помнить, что в определенное время между массивом и указателем существует резкое различие. Одна из самых заметных (а не единственная!) - разница в размерах.

Например:

char argv[] = "Test!"; 
char* pargv = argv; 

size_t s_argv = sizeof(argv); // equals to 6 - 5 letters of Test! + \0 
size_t s_pargv = sizeof(pargv); // equals to whatver size of pointer you have, i.e. 4 or 8 
+0

Чтобы быть педантичным, 'argv' является указателем. Но он всегда указывает на массив указателей, которые в свою очередь всегда указывают на массивы символов. – user2079303

+0

Aha! В этом есть смысл! Благодаря! – Matt

+0

@ user2079303, я согласен с этим, и я на самом деле считал его формулировкой таким образом, но если «массив» лучше понять OP. – SergeyA

0

Потому что argv является указателем на указатель к char s пока myword - просто указатель. myword имеет тип char* в то время как argv имеет тип char**.

+1

На самом деле, 'myword' не является' char * 'вообще. На самом деле это 'char [6]' – user2079303

+0

@ user2079303, который преобразуется в указатель всякий раз, когда вы начинаете работать с массивом. –

+0

Зависит от того, как вы оперируете, но да, во многих контекстах массив будет распадаться на указатель. – user2079303

0

Поскольку argv (предполагается, что вы имеете в виду, что один объявлены main() параметра) является

char* argv[] 
//^

и не

char argv[] 
-2

char* argv[] является двойной массив (или что вы хотите назвать это), так же, как char** argv. Объектом в argv[0] будет еще char*, argv[0][0] будет char.

+2

Нет, объект в 'argv [0]' будет не массивом, а 'char *'. – SergeyA

0

ARGV в основном что-то вроде этого:

enter image description here

Так на левом является сам аргумент - то, что на самом деле передается в качестве параметра main. Это адрес массива указателей. Каждая из них указывает на какое-то место в памяти, содержащее текст соответствующего аргумента, который был передан в командной строке. Затем в конце этого массива гарантированно будет нулевой указатель.

Обратите внимание, что фактическое хранилище для отдельных аргументов по крайней мере потенциально распределено отдельно друг от друга, поэтому их адреса в памяти могут быть организованы довольно случайным образом (но в зависимости от того, как вещи записываются, они могут могут также быть в одном непрерывном блоке памяти - вы просто не знаете или не должны заботиться).

+1

Из любопытства - почему вы изменили третий и второй аргументы, усложнив картину? – SergeyA

+4

@SergeyA: Чтобы подчеркнуть тот факт, что каждый из них (по крайней мере теоретически) распределен отдельно, и вы не можете ожидать, что они будут следовать любому определенному порядку в памяти. –

+0

Я вижу. Между прочим, мне нравятся новые аранжировки. – SergeyA

0

Я понимаю, что [argv] представляет собой массив символов

Это не так. Это даже не массив.

В C++ нет параметров массива, см., Например, C++ arrays as function arguments и Passing Arrays to Function in C++. Синтаксисы T[] и T[N], если они используются в объявлениях параметров, фактически означают T*.

Таким образом, argv - указатель на массив указателей. Эти указатели указывают на массивы символов.

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

  • Нет связанных вопросов^_^