【问题标题】:Having difficulty understand how this piece of code works(double pointers)难以理解这段代码是如何工作的(双指针)
【发布时间】:2023-04-04 20:10:01
【问题描述】:

我的老师给了我一个练习的更正,它包含使用双指针的代码。由于我对 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);   
}

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

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

感谢您的宝贵时间

【问题讨论】:

  • 天哪,这样的代码是怎么写出来的?我想我理解它,但它很难安静。
  • 这很简单:argv 是一个指向指针数组的指针,每个指针指向命令行参数的第一个字符。
  • 并且 runner 递增以跳过第一个 char* 字符串,这通常是程序本身的路径(虽然它可以是任意的,但可以是蠕虫)
  • 随着**的数量增加——意思是指向指针的指针,程序复杂性增加并且变得难以理解。

标签: c pointers


【解决方案1】:

让我们试着解释一下:

main(int argc, char** argv){

正常的主函数只是缺少可能导致问题的返回类型。 (c90 与 c99 AFIK)。第一个参数是大于 1 的参数计数(因为第一个参数是二进制名称(有助于多呼叫应用程序,如busybox))。第二个参数是字符串形式的参数,也就是 char-array,用于调用此二进制文件的 shell。

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

几乎与循环中的相同,只是它采用 2 字节参数之后的下两个参数。

【讨论】:

  • **runner = toupper(**runner) 只将第一个字符变为大写。
  • 如果将第 4 行的 'runner++' 替换为 '(*runner)++;' 不是更好吗?既然你真的想要它指向的指针移动一个字节?还是直接指向数组而不是间接指向?
【解决方案2】:

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

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

更明确地传递指针数组。

了解了事情的经过,就很容易看出来了

char** runner = argv;
++runner;

逻辑上等价于:

char** runner = &argv[1];

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 2020-06-05
        • 2011-05-16
        • 2014-05-10
        相关资源
        最近更新 更多