Я изучаю C, чтобы начать делать забавные вещи на низком уровне кода, и я наткнулся на сценарий, который не могу понять, и я уверен, что это потому, что у меня не так много опыта с этим.
В настоящее время мой код очень прост: он принимает некоторые аргументы, получает первый параметр, переданный в main, и сохраняет его как строку пути. Первый вопрос, который пришел в голову, заключался в том, будет ли правильно хранить параметры main как char *args[] или char **args, и я решил пойти с char **args, поскольку, согласно этот вопрос, могут быть сценарии, в которых первый будет недоступен, и я просто хотел сделать код, который был бы как можно более полным, и узнать причины этого процесса.
Вот код:
int main(int argc, char **args) {
if (args[1] == NULL) return 1;
// Get path of input file
char *path = &*args[1];
fputs(path, stdout);
return 0;
}
Учитывая приведенный выше код, что было бы лучше для получения значения, хранящегося в *args[1]? Это кажется очень загадочным, когда я смотрю на это, и мне тоже потребовалось время, чтобы добраться до него.
Насколько я понимаю, char **args - это указатель на массив указателей. Таким образом, если я сохраню строку или любое другое значение для последующего использования в одном из индексов args, мне придется назначить новый указатель на ячейку памяти (*path) и присвоить значение данного индекса для это (&*args[i]). Я слишком усложняю? Или этот мыслительный процесс правильный?
Если только не argc > 1, это неопределенное поведение. Проверьте перед доступом.





Вы можете просто написать:
char *path = args[1];
Операторы & и * инвертируют друг друга, поэтому &* или *& можно просто удалить из выражения.
Для начала эти два объявления функций
int main(int argc, char **args)
а также
int main(int argc, char *args[])
полностью эквивалентны, поскольку компилятор настраивает параметр, имеющий тип массива, на указатель на тип элемента массива.
В выражении инициализатора этого объявления
char *path = &*args[1];
последовательное применение двух операторов & и * является избыточным. Так что вы можете просто написать
char *path = args[1];
Также, как правило, вместо условия в инструкции if
if ( args[1] == NULL) return 1;
безопаснее будет написать
if ( argc < 2 ) return 1;
Не работает
char* path = args[1];?