“argv + argc”是什么意思?

cla*_*ncy 8 c++

我正在编写一个程序,它接受命令行参数并使用自定义比较器按字母数字排序的顺序打印它们。

一路上,我陷入了在std::set容器中插入命令行参数的困境。网上查了一些类似的代码,发现如下:

std::set<char*, decltype(customComparator)> args (argv, argv+argc, customComparator)
Run Code Online (Sandbox Code Playgroud)

这个argv + argc论点是什么意思/做什么?

当我尝试插入 cmd 参数时,例如:

std::set<char*, decltype(customComparator)> args (argv, customComparator)
Run Code Online (Sandbox Code Playgroud)

参数上有一条红色的波浪线argv

use*_*570 11

“argv + argc”是什么意思?

argv + argc是一个指针,指向最后一个命令行参数的末尾(或指向下图中所示的空值)。下面对此进行了解释(以图形和文本形式)。

该图显示为argc = 5

argv + argc

解释

让我们考虑一下声明:

int main (int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

在上面的声明中,第二个参数named的类型argv实际上是a char**。也就是说,argv是一个指向 a 的指针char。这是因为 a由于类型衰减而char* [] 衰减为 a 。char**

换句话说,argv是一个指针,指向元素类型为 的数组的第一个元素char*。此外,argv[i]数组的每个元素(具有类型的元素)本身都指向一个字符,该字符是空终止字符串char*的开头。也就是说,每个元素都指向元素类型为 的数组的第一个元素。argv[i]char


Gui*_*cot 6

您显示的代码使用基于迭代器的构造函数,该构造函数接收begin迭代器和过去的end迭代器。

问题是,STL 也将指针视为迭代器。运算++ptr符以及ptr != end_ptr和 都可以工作*ptr

因此,如果您想从 C 风格的对象集合构造一个 STL 容器,这是很有可能的。argv是所有参数值的开始,也是argv[argc - 1]结束。要使指针超过末尾,只需执行argv + argc.


n. *_* m. 6

  1. 构造函数的此重载std::set接受两个迭代器和一个比较器。这两个迭代器应该定义一个半开范围。第二个迭代器指向范围的末尾,对于许多类型的范围来说,它是最后一个元素之后的那个。
  2. 指针是一个迭代器。
  3. 如果argv指向数组的第一个元素,并且argc是整数,则argv + argc指向argc同一数组的第一个元素(从零开始)。
  4. 由于数组中存在完全argc有意义的元素argvargv + argc因此将指针指向数组中最后一个有意义的元素。(那里碰巧还有另一个元素,它是一个空指针,我们对它不感兴趣)。

总而言之,该范围[argv, argv + argc)正是标准库在很多地方所期望的那种半开放范围。