1) Argc - это число аргументов, но, если честно, как вы можете добавить аргумент перед именем программы, которое argv[0]
. Представьте себе программу под названием foo
, вы не можете просто сказать args1 foo args2
, поскольку это бессмысленно, несмотря на то, что argc
является типом со знаком int
, то есть не существует такой вещи, как argv[-1]
, которая получит вам 'args1'. ..
2) Причина, по которой argc на самом деле не является индексом вектора аргумента (следовательно, ' argv '), поскольку во время выполнения имя исполняемой программы вставляется в нулевое смещение, т. Е. argv[0]
следовательно, argc
будет выключен на 1.
3) Индексы массива, с точки зрения манипулирования указателем, при условии вы находитесь в границах блока памяти, в котором находится указатель, использование индексов массива как отрицательных допустимо поскольку индексы массива являются ярлыками для указателей, и не только они являются коммутативными, например
char v[100];
char *p = &v[0];
You can do this:
p[55] = 'a';
Which is the same as
*(p + 55) = 'a';
You can even do this:
p = &v[55];
p[-10] = 'b' /* This will stuff 'b' into 45'th offset! */
Which is the same as
*(p - 10) = 'b';
Кроме того, если вы используете массивы и манипулируете ими таким образом, что он находится за пределами границ - это неопределенное поведение и будет зависеть от реализации среды выполнения того, как ее обрабатывать, возможно, ошибки сегментации или программы. авария ....
4) В * nix-средах некоторым будет предоставлен третий параметр, предоставленный main char **endvp
, опять же, он редко используется в мире Microsoft для DOS / Windows. В некоторых реализациях * nix времени выполнения, по предысторическим причинам, вы могли передавать переменные среды через среду выполнения.