Так почему бы вам не разыграть его?
printf("argv = %p\n", (void *)argv);`
Указан указатель %p
(POSIX printf()
; C11 §7.21.6.1 Функция fprintf
):
p
- Аргумент должен быть указателем на void
. Значение указателя преобразуется в последовательность печатных символов способом, определяемым реализацией.
Поскольку char **
не является void *
, вам необходимо выполнить явное преобразование. Стандарт не разрешает компилятору выполнять для вас преобразование в void *
- многоточие в объявлении printf()
означает, что происходит продвижение аргументов по умолчанию, но это влияет только на тип float
и целочисленные типы поменьше. чем int
(short
, char
и т. д.).
На большинстве машин в наши дни это не работает. На (давно устаревшей) машине, где я научился программировать на C, еще не было void *
(слишком стар для стандарта), но эквивалент был char *
, а значение адреса char *
для данное расположение в памяти отличалось от значения указателя для любого другого типа - приведение не было обязательным.
Обратите внимание, что я предполагаю, что вы намереваетесь напечатать значение адреса. Если вы намереваетесь распечатать содержимое, тогда еще многое предстоит сделать.