Обращение к исходным вопросам:
argv
- это массив указателей, каждый из которых указывает на массив символов.argv[1]
- указатель на массив символов с первым аргументом (т. Е. При запуске ./program arg1 arg2
указатель argv[1]
указывает на строку arg1
).
Амперсанд используется для обозначенияссылка, которая для большинства целей совпадает с указателем.Это синтаксический сахар, облегчающий передачу ссылки на переменную, которую вы уже объявили.Типичным примером является использование scanf.
int x = 1;
scanf(..., &x, ...)
эквивалентно
int x = 1;
int *p = &x;
scanf(..., p, ...)
Сама программа предназначена для отражения порядка байтов.Недостаточно переходить от символа к символу, потому что нужно переворачивать два байта за раз (то есть за коротким коротким замыканием), поэтому он работает с использованием шорт.
(unsigned short*)argv[1]
указывает компилятору обрабатывать адрес, как если бы он был массивом шортов.Для примера:
unsigned char *c = (unsigned char *)argv[1];
c[1]; /*this points to the address one byte after argv*/
unsigned short *s = (unsigned short *)argv[1];
s[1]; /*this points to the address two bytes after argv */