C程序问题的争论

时间:2011-07-07 20:10:42

标签: c command-line-arguments

  

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

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

3 个答案:

答案 0 :(得分:7)

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

在C

void f(int*);

void f(int[]);

void f(int[42]);

是三个完全相同的声明。

答案 1 :(得分:4)

**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;
}

答案 2 :(得分:2)

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

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

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