在 C 中,尽管看起来非常相似,但指针和数组并不相同。这p
是“指向 10 个整数数组的指针”类型。您将它用作“指向 4 个 10 个整数数组的数组的指针”,它是一个内存块(唯一的指针是最外层的指针)。它基本上是一个动态分配的int[4][10]
.
阅读这些定义的诀窍是意识到它们的编写方式与您使用该项目的方式相同。如果你有:
*x[10];
首先应用数组下标,然后是指针解引用。所以如果你定义它是一个指针数组int *x[10]
。如果您使用括号覆盖正常优先级,则可以首先取消指针引用,因此您有一个指向数组的指针。
令人困惑?它变得更糟。在函数参数中,函数参数的最外层数组被转换为指针。
int *p[10]; // array of 10 pointer to int
int (*p)[10]; // pointer to array of 10 ints
void foo(int *p[10] /* pointer to pointer to int */);
void foo(int (*p)[10] /* pointer to array of 10 ints */);
此外,当您使用数组时,它们会被转换为指针。
int x[10]; // array of 10 int
sizeof(x); // 10 * sizeof(int)
int *y = x; // implicitly converts to a pointer to &x[0]!
sizeof(y); // sizeof(int *)
这意味着您可以为数组数组分配内存,然后让它隐式转换为指向数组的指针,然后您将其用作数组数组!
无论如何,这一切都非常令人困惑,所以请不要在生产代码中使用它——至少,如果没有明确的 typedef:
typedef int vector[3];
vector *array_of_vectors; // actually a pointer to a vector,
// but you can use it as an aray to a vector if enough
// memory is allocated