我正在查看这个创建 shell 的小程序。 parse()
取一个字符指针line
和一个字符指针数组argv
,将每个单词的地址保存在argv
。
void parse(char *line, char **argv) {
while (*line != '\0') { /* if not the end of line ....... */
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '\0'; /* replace white spaces with 0 */
*argv++ = line; /* save the argument position */
printf("%p\n",*argv);
while (*line != '\0' && *line != ' ' &&
*line != '\t' && *line != '\n')
line++; /* skip the argument until ... */
}
*argv = '\0'; /* mark the end of argument list */
}
我不明白的是 argv
在函数退出后不知何故回到了第一个词。主要函数调用:
parse(line, argv); /* parse the line */
if (strcmp(argv[0], "exit") == 0) /* is it an "exit"? */
exit(0);
argv[0]
在 line
的开头,而它恰好在 line
的结尾?
最佳答案
原因是C中参数是按值传递的,这样想:
void func(int a)
{
a = 20;
}
int main()
{
int val = 10;
printf("%d", val);
func(val);
printf("%d", val);
}
在上面的两个打印中,打印出的值都是 10。如果你想修改 func 中的 val,那么你必须传递它的地址。指针也是如此。指针就像任何其他参数一样按值传递。因此,如果您有这样的事情:
#include <stdio.h>
void func(char **argv)
{
while (*argv != 0) {
printf("%s\n", *argv);
argv++;
}
printf("*****done*****\n");
}
int main(int argc, char **argv)
{
func(argv);
printf("%s\n", argv[0]);
}
然后你运行它:
gcc a.c
./a.out hello how are you
输出将是:
./a.out
hello
how
are
you
*****done*****
./a.out
如果你希望 argv 从函数返回时指向最后一个参数,那么你必须传递它的地址:
#include <stdio.h>
void func(char ***argv)
{
while (**argv != 0) {
printf("%s\n", **argv);
(*argv)++;
}
(*argv)--;
printf("*****done*****\n");
}
int main(int argc, char **argv)
{
func(&argv);
printf("%s\n", argv[0]);
}
现在输出将是:
./a.out
hello
how
are
you
*****done*****
you
关于c - 指向指针数组的指针返回初始地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36807017/