很难理解这段代码是如何工作的(双指针)

时间:2013-11-03 11:22:01

标签: c pointers

我的老师给了我一个练习的更正,它包含使用双指针的代码。由于我是C的新手,我很难理解代码的作用。 我知道单个指针的基础知识,但不知怎的,我在双指针路径上迷失了方向。

代码:

#include <stdio.h>

main(int argc, char** argv){
    printf("\nHello ");
    char** runner = argv;
    ++runner;
    while(*(runner+2) != 0){
        **runner = toupper(**runner);     
        printf("%s, ",*runner);         
        ++runner;
    }

    **runner = toupper(**runner);   
    printf("%s ",*runner);    
    ++runner;
    **runner = toupper(**runner);   
    printf("and %s!",*runner);   
}

- 我的第一个问题是理解为什么main函数使用双指针? - 第二个问题,在初始化双指针,跑步者之后,它被告知要进一步指向一个地方。但是,如果它指向一个指针,指向一个你不知道的地方,你究竟怎么知道指向它的位置?

  • 由于我在理解前两件事时遇到问题,我无法继续,也不知道代码如何进一步发挥作用。

感谢您的时间

4 个答案:

答案 0 :(得分:3)

让我们试着解释一下:

main(int argc, char** argv){

正常的主要功能只是缺少可能导致问题的返回类型。 (c90 vs c99 AFIK)。第一个参数是> 1的参数计数(因为第一个参数是二进制名称(对于像busybox这样的多调用应用程序有帮助))。第二个参数是作为字符串aka char-array的参数,它来自调用此二进制文件的shell。

printf("\nHello ");
char** runner = argv;
++runner;

打印hello,跳过该二进制文件的第一个参数(二进制名称)

while(*(runner+2) != 0){

检查当前参数的第三个字节是否为空字节。恕我直言,如果没有第二个参数,这可能会导致问题。

    **runner = toupper(**runner);

将其转换为大写。

    printf("%s, ",*runner);

打印出该参数

    ++runner;

跳转到下一个论点。

}
**runner = toupper(**runner);   
printf("%s ",*runner);    
++runner;
**runner = toupper(**runner);   
printf("and %s!",*runner);

与循环中的几乎相同,只需要在2字节参数之后接下来的两个参数。

答案 1 :(得分:1)

当一个指针数组传递给一个函数时,它会衰减&#34;指向指针的指针。这正是argv的{​​{1}}所发生的事情:它是指向char的指针。有时,main声明被写为等效的

main

更明确地传递一个指针数组。

了解正在进行的操作后,很容易看出

int main(int argc, char *argv[])

在逻辑上等同于:

char** runner = argv;
++runner;

作者只是跳过char** runner = &argv[1]; 的初始参数,然后直接进入正确的命令参数,从索引main开始。

答案 2 :(得分:0)

为什么main函数使用双指针?

main函数接收2个参数:传递给命令行的参数个数(argc表示参数count)和包含参数的数组。

参数是一个字符串,所以它是C中的char*。你有一个字符串数组,所以argv的类型是char**

第二个问题,在初始化双指针,跑步者之后,它被告知要进一步指向一个地方。但是,如果它指向一个指针,指向一个你不知道的地方,你究竟怎么知道它指向的位置?

runner指向argv指向的相同数组。但是现在当你执行++runner时,它将指向参数数组中的下一个元素。在C中,第一个字符串实际上是命令的名称,因此runner现在指向命令行中传递的第一个参数。

答案 3 :(得分:0)

我没有运行你的代码,但我可以在内部介绍为什么使用双指针。

Argv持有这些论点。 Argv [0]是程序名,argv [1]是第一个参数,等等。这就是为什么“++ runner;”首先递增以访问第一个参数。

在这种情况下,双指针允许您通过轻松递增来索引内存中的位置,然后当您到达那里时访问您的数据,而这恰好是另一个char *。