c - 指向指针数组的指针返回初始地址

标签 c arrays pointers parameter-passing

我正在查看这个创建 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/

相关文章:

c++ - 计算 NLOC 的简单脚本?

可以通过返回指向结构的指针来改进此代码吗?

c - c中最有效的指针算术类型

c - 如何将c代码转换为vb.net?

c - c中的宏函数如何使用引用传递

c - 是否有可能在 main 之后声明的变量具有文件范围?

javascript - 来自多维数组的全日历事件数据

javascript - 使用 NodeJS 将开始和停止时间发布到 mysql(sequelize)

php - 将字符串拆分为数组,并将分隔符设置为键

pointers - 在 Pascal 中使用 Dispose