【问题标题】:Why is argv[1] an entire word and not a single letter?为什么 argv[1] 是一个完整的单词而不是一个字母?
【发布时间】:2016-01-21 18:18:34
【问题描述】:

我正在学习 c++,但我似乎找不到一个很好的解释,那就是 char* argv[] 的工作原理。我知道这是一个字符数组,但据我所知,如果你有

char myword[] = "Hello";

那么 myword[1] 是“e”。

那么在使用 argv[] 时,为什么 argv[1] 是整个第一个参数,而不仅仅是程序名称的第二个字母?这里有一些我不明白但我不确定是什么......

感谢您的任何解释!

【问题讨论】:

    标签: c++ char argv


    【解决方案1】:

    您似乎忽略了 argv(如 int main(int argc, char* argv[]) 中的)是指向 char 的指针,而不是 char 的指针。

    关于数组和指针的一些有趣的东西。由于指针可以被视为一个数组(前提是它指向一个数组)并且数组可以被视为指针(对此的技术术语是decay to pointers)一个数组和指针可以经常混合使用.

    但是,这样做时,仍然需要记住,在某些时候,数组和指针之间存在明显的区别。最明显的一个(不是唯一一个!)是它们的大小差异。

    例如:

    char argv[] = "Test!";
    char* pargv = argv;
    
    size_t s_argv = sizeof(argv); // equals to 6 - 5 letters of Test! + \0
    size_t s_pargv = sizeof(pargv); // equals to whatver size of pointer you have, i.e. 4 or 8
    

    【讨论】:

    • 为了迂腐,argv 是一个指针。但它总是指向一个指针数组——而指针又总是指向字符数组。
    • 啊哈!那讲得通!谢谢!
    • @user2079303,我同意这一点,我实际上考虑过这样表述,但 OP 会更好地理解“数组”。
    • @SergeyA 我只是觉得你纠正其他人argv[0] 不是数组而是指针很有趣,因为这与说argv 本身是一个数组一样正确(或不正确)。
    • @user2079303,我也是。为了稍微缓解这一点,我编辑了我的答案以更清晰。
    【解决方案2】:

    因为argv 是指向chars 的指针,而myword 只是一个指针。 myword 是 char* 类型,而 argv 是 char** 类型。

    【讨论】:

    • 实际上,myword 根本不是char*。其实是char[6]
    • @user2079303 每当您开始对数组进行操作时,它都会转换为指针。
    • 取决于你如何操作它,但是是的,在许多情况下,数组会衰减为指针。
    【解决方案3】:

    因为argv(假设您的意思是声明为main() 参数的那个)是

    char* argv[]
     // ^
    

    而不是

    char argv[]
    

    【讨论】:

      【解决方案4】:

      Argv 基本上是这样的:

      所以左边是参数本身——实际上是作为参数传递给main。那是指针数组的地址。这些中的每一个都指向内存中的某个位置,其中包含在命令行上传递的相应参数的文本。然后,在该数组的末尾,保证有一个空指针。

      请注意,各个参数的实际存储空间至少可能是彼此分开分配的,因此它们在内存中的地址可能会相当随机地排列(但取决于事情的编写方式,它们可能 em> 也位于单个连续的内存块中——你根本不知道也不应该关心)。

      【讨论】:

      • 出于好奇 - 为什么要重新排列第三个和第二个参数,使画面复杂化?
      • @SergeyA:强调每个(至少在理论上)是单独分配的,你不能指望它们在内存中遵循任何特定的顺序。
      • 我明白了。顺便说一句,我更喜欢新的安排。
      【解决方案5】:

      我知道 [argv] 是一个字符数组

      不是。它甚至不是一个数组。

      C++ 中没有数组参数,参见例如C++ arrays as function arguments 和 Passing Arrays to Function in C++。 T[] 和 T[N] 语法,如果在参数声明中使用,实际上表示 T*。

      所以, argv 是指向指针数组的指针。这些指针指向字符数组。

      【讨论】:

        【解决方案6】:

        char* argv[] 是一个双精度数组(或任何你想称呼它的名称),与char** argv 相同。 argv[0] 处的对象将是另一个 char*,argv[0][0] 将是 char。

        【讨论】:

        • 不,argv[0] 的对象不是数组,而是char*。
        猜你喜欢
        • 2012-05-18
        • 2020-01-15
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        相关资源
        最近更新 更多