数组指针等价只适用于函数参数,因此尽管 void fn(const char* argv[])
和 void fn(const char** argv)
是等价的,但当涉及要传递到函数中的变量时,它并不成立。
考虑以下示例:
void fn(const char** argv)
{
...
}
int main(int argc, const char* argv[])
{
fn(argv);
const char* meats[] = { "Chicken", "Cow", "Pizza" };
fn(meats);
const char** meatPtr = meats;
fn(meatPtr);
const char vegetables[][10] = { "Avocado", "Pork", "Pepperoni" };
fn(vegetables);
return 0;
}
“vegetables”不是指向指针的指针,它直接指向一个3*10连续字符序列中的第一个字符。将上面的fn(vegetables)替换为以下内容:
int main(int argc, const char* argv[])
{
const char vegetables[][10] = { "Avocado", "Pork", "Pepperoni" };
printf("*vegetables = %c\n", *(const char*)vegetables);
return 0;
}
输出结果为"A":vegetables本身直接指向字符,没有中间指针。
蔬菜赋值基本上是这个的快捷方式:
const char* __vegetablesPtr = "Avocado\0\0\0Pork\0\0\0\0\0\0Pepperoni\0";
vegetables = __vegetablesPtr;
并且
const char* roni = vegetables[2];
翻译为
const char* roni = (&vegetables[0]) + (sizeof(*vegetables[0]) * /*dimension=*/10 * /*index=*/2);
char* argv[]
可能更有意义,因为它更容易阅读作为指针数组。 - austinargv
是指针指向指针。要考虑sizeof()
、将argv
变量分配给其他内容的可能性等。 - user529758argv
被称为指针数组。但严格来说,main
函数的形式参数会被调整为指向指针的指针。 - ouah