Рассмотрим программу с argc == 3
.
argv
|
v
+---------+ +----------------+
| argv[0] |-------->| program name\0 |
+---------+ +-------------+--+
| argv[1] |-------->| argument1\0 |
+---------+ +-------------+
| argv[2] |-------->| argument2\0 |
+---------+ +-------------+
| 0 |
+---------+
Переменная argv
указывает на начало массива указателей. argv[0]
— первый указатель. Он указывает на имя программы (или, если система не может определить имя программы, то строка для argv[0]
будет пустой строкой; argv[0][0] == '\0'
). argv[1]
указывает на первый аргумент, argv[2]
указывает на второй аргумент и argv[3] == 0
(эквивалентно argv[argc] == 0
).
Другая деталь, которую вам, конечно же, нужно знать, это array[i] == *(array + i)
для любого массива.
Вы спрашиваете конкретно:
- Почему **argv указывает на первый символ, а не на всю строку?
*argv
эквивалентно *(argv + 0)
и, следовательно, argv[0]
. Это char *
. Когда вы разыменовываете char *
, вы получаете «первый» символ в строке. Таким образом, **argv
эквивалентно *(argv[0])
, *(argv[0] + 0)
или argv[0][0]
.
(Можно обоснованно утверждать, что **argv
— это символ, а не указатель, поэтому он не «указывает на первый символ». Это просто другое имя для 'p'
из "program name\0"
.)
- Аналогично, почему *argv[0] указывает на то же самое, что и в предыдущем примере.
Как отмечалось ранее, argv[0]
— это указатель на строку; поэтому *argv[0]
должен быть первым символом в строке.
- Почему
*argv
указывает на всю первую строку, а не на первый символ, как в предыдущем примере?
Это вопрос условности. *argv
указывает на первый символ первой строки. Если вы интерпретируете его как указатель на строку, он указывает на «всю строку» точно так же, как char *pqr = "Hello world\n";
указывает на «всю строку». Если вы интерпретируете его как указатель на один символ, он указывает на первый символ строки. Думайте об этом как о корпускулярно-волновом дуализме, только здесь это двойственность символов и строк.
- Почему
*argv + 1
указывает на строку «минус первый символ» вместо указания на следующую строку в массиве?
*argv + 1
это (*argv) + 1
. Как уже говорилось, *argv
указывает на первый символ первой строки. Если вы добавите 1 к указателю, он будет указывать на следующий элемент; поскольку *argv
указывает на символ, *argv+1
указывает на следующий символ.
*(argv + 1)
указывает на (первый символ) следующей строки.
person
Jonathan Leffler
schedule
13.11.2012
char* argv[]
arv[0]
— первая строка,argv[0][0]
— первый байт первой строки и т. д. - person Alex F   schedule 13.11.2012T[]
совпадает сT*
. 2) Для указателяp
p[i]
идентично*(p + i)
, а также&*p
идентичноp
. Используйте это, чтобы подумать над своим вопросом. - person Kerrek SB   schedule 13.11.2012