基本上,char* argv[] 表示字符指针的数组,而 char** argv 表示指向字符指针的指针。
在任何数组中,数组的名称是指向数组第一个元素的指针,它包含第一个元素的地址。
因此,在下面给出的代码中,在字符数组 x 中,x 是指向第一个元素 '1' 的指针,它是一个字符。所以它是指向字符的指针。
而在数组 arr 中,arr 是指向第一个元素 x 的指针,x 本身是一个指向字符的指针。因此它是指向另一个指针的指针。
因此,x 是 char*,arr 是 char**。
当在函数中接收某些东西时,基本规则是,您必须告诉您正在接收的东西的类型。因此,您可以简单地说您想要接收一个 char**,或者也可以说 char* arr[]。
在第一种情况下,我们不需要考虑任何复杂的事情。我们只需要知道,我们正在接收一个 char* 数组。难道我们不知道这一点吗?因此,我们接收它并使用它。
在第二种情况下,很简单,就像我上面解释的那样,arr 是 char**,您可以将其作为它的类型并安全地接收它。现在系统知道我们接收到的东西的类型,我们可以通过简单地使用数组注释来访问下一个元素。就好像我们已经接收到了数组的起始地址一样,我们肯定可以访问下一个元素,因为我们知道它的类型,我们知道它包含什么以及如何进一步使用它。我们知道它包含指向字符的指针,因此我们也可以合法地访问它们。
void func1(char* arr[])
{
}
void func2(char** arr)
{
}
int main()
{
char x[3]={'1', '2', '3'};
char y[3]={'4', '5', '6'};
char z[3]={'7', '8', '9'};
char* arr[3]={x, y, z};
func1(arr);
func2(arr);
}
char *argv[]
与char **argv
是等价的。这更像是一种偏好的编码风格问题。 - Grzegorz Szpetkowski