有没有更好的方法从 "char **" 中获取这个值?

Is there a better way to fetch this value from "char **"?

我正在学习 C 以开始做一些有趣的低级代码,但我无意中遇到了一个我无法理解的场景,我确定这是因为我不知道对它有很多经验。

目前我的代码非常简单:它接受一些参数,并获取传递给 main 的第一个参数,并将其存储为路径字符串。我想到的第一个问题是将 main 参数存储为 char *args[]char **args 是否正确,我决定使用 char **args 因为根据this question 可能会出现第一个无法访问的情况,我只是想编写一个尽可能完整的代码,并了解过程中的原因。

代码如下:

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])。我是不是把事情复杂化了?或者这个思考过程是否正确?

你可以简单地写:

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;