【问题标题】:Arguments to C program question [duplicate]C程序问题的参数[重复]
【发布时间】:2011-07-07 20:10:42
【问题描述】:

可能重复:
Should I use char** argv or char* argv[] in C?

c 程序的第二个参数使用char **argvchar *argv[] 有什么区别。它会影响字符串传递的方式吗?谢谢:-)

【问题讨论】:

  • 我不认为这是一个“答案”,所以我会把它放在这里,但我确实觉得这很重要。你会发现人们在读这本书时会遇到困难,在固执和无知之间。如果您为某人工作并且被告知要以特定的方式进行操作,请永远不要忘记它,否则您可能会很高兴尝试解决所有这些问题。 :P.
  • 数组衰减为指针,所以两者没有区别。

标签: c command-line-arguments


【解决方案1】:

绝对没有区别。完全没有。

在 C 中

void f(int*);

void f(int[]);

void f(int[42]);

是三个完全相同的声明。

【讨论】:

    【解决方案2】:

    **argv*argv[] 作为函数参数在技术上是相同的 - 因为 C 会将任何数组转换为函数参数中的指针。

    请注意,这可能会引起您的注意,例如,这是完全有效的,不会引发任何警告(或错误),即使初学者可能认为传递的数组无效:

    void func(int array[2])
    {
        array[1] = 1; // buffer overrun: will write past the end of a[].
    }
    
    int main()
    {
        int a[1];
        func(a);
        return 0;
    }
    

    【讨论】:

    • 传递的数组是有效的,但也许最好强调一下 array[2] 将写出数组边界(即使使用int a[2])...
    • @Shin :好点 - 按照建议修改。
    【解决方案3】:

    在函数参数声明的上下文中,T a[]T *a 是同义词。在这两种情况下,a 都是指向T 的指针。

    当数组表达式出现在上下文中,而不是作为sizeof 或一元& 运算符的操作数(例如函数调用中的参数)时,表达式的类型从“N- T的元素数组”到“指向T的指针”,表达式的值是数组中第一个元素的地址。因此,函数永远无法接收数组值;它只能接收指向第一个元素的指针。

    dmr 决定使用T a[] 语法来明确意图(a 指的是T 数组的第一个元素,而不是指向T 单个实例的指针),但我认为这引起了更多的胃灼热,这是值得的。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2011-07-19
      • 2018-08-23
      • 1970-01-01
      • 2013-09-07
      相关资源
      最近更新 更多