有没有更好的方法从 "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;
我正在学习 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;