此代码由我的c ++讲师提供的样本期中考试。我们在非常基础的层面上介绍了argc和argv,所以我理解这些表达式本身就是什么意思。但是,对于像dereference运算符和' ++'让我感到困惑的是,我用google搜索的内容还不够清楚,我可以将它应用到这个具体的例子中。此外,当我尝试编译时,它提供了这个错误:
In function 'int summer(int*, char**)':
Line 9: error: cannot convert 'char**' to 'const char*' for argument '1' to 'int atoi(const char*)'
compilation terminated due to -Wfatal-errors.
我们尚未正式报道指针,但我认为我对它们了解得很好。 char **意味着你要解除引用两次,所以指针char的值是指向其他东西的指针,所以第二个*表示我们想要它的值。它是不变的,因为我们依赖于命令行中的输入并且无法更改?我不明白这一点。
#include <iostream>
using namespace std;
int summer(int *acc, char * ptr[])
{
register int n;
n = atoi(ptr);
*acc = *acc + n;
}
main(int argc, char * argv [])
{
int sum = 0;
while (--argc)
summer(&sum, *++argv);
cout << "sum is " << sum << endl;
}
另一个问题:当将* ++ argv传递给summer()时,这是否意味着(argv [] + 1)的值?甚至会是什么?将值1添加到整个向量?我知道atoi(数组)意味着将字符串更改为数值,然后我们将其存储在寄存器int&#39; n&#39;中,然后将其添加到main中直接更改的总和。这就是我真正理解的代码中唯一的部分。对不起,如果我的问题/这篇文章有点乱。
总结我的问题:
谢谢。
编辑:
好的,我已经做了你们建议的改变(谢谢!!):
#include <iostream>
using namespace std;
int summer(int *acc, char * ptr)
{
register int n;
n = atoi(ptr);
*acc = *acc + n;
return 0;
}
int main(int argc, char * argv[])
{
int sum = 0;
while (--argc)
summer(&sum, *++argv);
cout << "sum is " << sum << endl;
return 0;
}
我还添加了返回值,因为编译器由于函数类型没有返回值而给出了新的错误。在键盘上,它编译并打印&#34;总和为零,&#34;但是,它仍然无法在我正在使用的Dev C ++ 5.7.1上编译。它没有显示错误消息(我一直在阅读的是来自Codepad在线编译器),或者至少我无法找到打开它们的位置。它只是突出显示它似乎有问题的线,这仍然是atoi(ptr)的线。
答案 0 :(得分:2)
*argv
相当于argv[0]
,因此++argv;
会使*argv
等同于原来argv[1]
。因此*++argv
评估与argv[1]
(第一个命令行参数,在程序本身的名称之后)相同的事情,除了它增加argv
,而argv[1]
显然不
对于您的错误,您应该更改:
int summer(int *acc, char * ptr[])
{
为:
int summer(int *acc, char * ptr)
{
当您取消引用char **
argv
的类型时,您会获得char *
。 char *
是atoi()
所期待的。
您的计划基本上与此相同:
#include <iostream>
#include <cstdlib>
using namespace std;
void summer(int * acc, char * ptr)
{
*acc += atoi(ptr);
}
int main(int argc, char * argv [])
{
int sum = 0;
for ( int i = 1; i < argc; ++i ) {
summer(&sum, argv[i]);
}
cout << "sum is " << sum << endl;
}
除了您没有检查argc
的麻烦值。
答案 1 :(得分:0)
++
称为增量运算符。它通常会增加1。
argv
衰减到指向程序参数容器的指针。
表达式++argv
指向下一个参数(如果有)。
答案 2 :(得分:0)
增加指针意味着使其指向列表中的下一个项目。
argv
的类型为char **
(don't be distracted by the square brackets),这意味着它指向char *
,它位于相邻char *
的列表中。 argc
参数让我们知道在哪里可以找到所述列表的结尾。
因此,执行++argv
意味着argv
现在将指向列表中的下一个char *
。将*
应用于此(并将结果传递给函数)意味着我们将列表中下一个char *
的值发送给该函数。
所有这一切的结果是每个参数调用一次函数,不包括第一个参数(因为我们在第一次解除引用之前++
&#39; d。)
NB。这段代码实际上有一个bug;如果argc == 0
它会进入la-la land。它应该在进入循环之前检查这种情况。
答案 3 :(得分:0)
它是否保持不变,因为我们依赖于命令行中的某些输入并且无法更改?
不,const char *
位指的是atoi()
接受的参数类型。它是指向常量char
的指针。请注意,char *
可以隐式转换为const char *
,但不能相反。
所有这些意味着atoi()
接受指向一个字符的指针,它承诺它不会修改指针的目标。
我的猜测是ptr
参数应该是char * ptr
而不是char * ptr[]
。如果你改变它,代码应该编译。