我的老师给了我一个练习的更正,它包含使用双指针的代码。由于我是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函数使用双指针? - 第二个问题,在初始化双指针,跑步者之后,它被告知要进一步指向一个地方。但是,如果它指向一个指针,指向一个你不知道的地方,你究竟怎么知道指向它的位置?
感谢您的时间
答案 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 *。