Удобнее думать о []
как об операторе для указателей, а не массивов;он используется с обоими, но, поскольку массивы распадаются на указатели, индексирование массивов все еще имеет смысл, если смотреть таким образом.По сути, он смещает, а затем разыменовывает указатель.
Итак, с argv[1]
вы получите *(argv + 1)
с более удобным синтаксисом.Это дает вам второй char *
в блоке памяти, на который указывает argv
, поскольку char *
- это тип, на который указывает argv
, и [1]
смещает argv
на sizeof(char *)
байт, а затем разыменовывает результат.
(*argv)[1]
разыменовывает argv
сначала с *
, чтобы получить первый указатель на char
, затем смещает это на 1 * sizeof(char)
байт, затем разыменовывает , чтобы получитьchar
.Это дает второй символ в первой строке группы строк, на который указывает argv
, что, очевидно, не то же самое, что argv[1]
.
Так что рассматривайте переменную индексированного массива как указатель, являющийсяуправляется оператором «смещение, а затем разыменование указателя».