C程序问题的参数

C程序问题的参数,c,command-line-arguments,C,Command Line Arguments,可能重复: 对于c程序的第二个参数,使用char**argv和char*argv[]有什么区别。它会影响字符串的传递方式吗?谢谢:-)绝对没有区别。一点也不 在C中 及 及 是三个完全相同的声明。**argv和*argv[]作为函数参数在技术上是相同的,因为C会将任何数组转换为函数参数中的指针 请注意,这可能会让您大吃一惊,例如,这是完全有效的,不会引发任何警告(或错误),即使初学者可能认为传递的数组无效: void func(int array[2]) { array[1] = 1;

可能重复:


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

绝对没有区别。一点也不

在C中


是三个完全相同的声明。

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

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

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


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

我不认为这是一个“答案”,所以我会把它放在这里,但我确实觉得这很重要。你会发现,人们在阅读这本书时会遇到这样或那样的问题,在固执和无知之间。如果你为某人工作,并且被告知要以一种特定的方式去做,千万不要忘记,否则你可能会有一段美好的时光去尝试解决所有这些问题P.数组衰减为指针,因此两者之间没有区别。传递的数组是有效的,但也许最好强调一个事实,即数组[2]将写出数组边界(即使使用
int a[2]
)…@Shin:Good point-按建议修改。
void f(int[]);
void f(int[42]);
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;
}