0

我的老师给了我一个练习的更正,它包含使用双指针的代码。由于我对 CI 相当陌生,因此难以理解代码的作用。我知道单指针的基础知识,但不知何故我在双指针路线上迷失了方向。

编码:

#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);   
}

- 我遇到的第一个问题是理解为什么主函数使用双指针?-第二个问题,在初始化双指针 runner 之后,它被告知指向一个更远的地方。但是,如果它指向一个指针,而指针本身又指向一个你不知道的地方,那么你到底怎么知道它指向哪里呢?

  • 由于我无法理解前两件事,因此我无法继续,也不知道代码如何进一步工作。

感谢您的时间

4

4 回答 4

3

让我们试着解释一下:

main(int argc, char** argv){

正常的 main 函数只是缺少可能导致问题的返回类型。(c90 与 c99 AFIK)。第一个参数是大于 1 的参数计数(因为第一个参数是二进制名称(有助于多呼叫应用程序,如busybox))。第二个参数是作为字符串的参数,也就是 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 字节参数之后的下两个参数。

于 2013-11-03T11:30:07.253 回答
1

当指针数组传递给函数时,它“衰减”为指向指针的指针。这正是 of 发生argv的情况main:它是指向 char 的指针。有时,main声明写成等价的

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

更明确地传递指针数组。

随着对正在发生的事情的理解,很容易看出

char** runner = argv;
++runner;

逻辑上等价于:

char** runner = &argv[1];

作者只是跳过了 的初始参数main,直接进入正确的命令参数,它从 index 开始1

于 2013-11-03T11:33:14.523 回答
0

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

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

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

第二个问题,在初始化双指针 runner 之后,它被告知再指向一个地方。但是,如果它指向一个指针,而指针本身又指向一个你不知道的地方,那么你到底怎么知道它指向哪里呢?

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

于 2013-11-03T11:32:59.503 回答
0

我没有运行你的代码,但我可以告诉你为什么使用双指针。

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

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

于 2013-11-03T11:33:05.010 回答