可能重复:
我应该在C中使用char**argv还是char*argv[]?
使用char **argv
和char *argv[]
作为c程序的第二个参数有什么区别。它会影响字符串的传递方式吗?感谢:-(
绝对没有区别。完全
in C
void f(int*);
和
void f(int[]);
和
void f(int[42]);
是三个完全相同的声明。
**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;
}
在函数参数声明的上下文中,T a[]
和T *a
是同义词。在这两种情况下,a
都是指向T
的指针。
当数组表达式出现在上下文中而不是作为sizeof
或一元&
运算符的操作数(例如函数调用中的参数(时,表达式的类型将从"T
的N元素数组"隐式转换为"指向T
的指针",表达式的值是数组中第一个元素的地址。因此,函数永远不能接收数组值;它只能接收指向第一个元素的指针。
dmr决定使用T a[]
语法来明确意图(a
指的是T
数组的第一个元素,而不是指向T
单个实例的指针(,但我认为这会引起更多的心痛。