int g[] = {9,8};
这声明了一个 int[2] 类型的对象,并将其元素初始化为 {9,8}
int (*j) = g;
这声明了一个int *类型的对象,并用一个指向g的第一个元素的指针初始化它。
第二个声明用 g 以外的东西初始化 j 的事实很奇怪。 C 和 C++ 只是对数组有这些奇怪的规则,这就是其中之一。这里的表达式g 被隐式地从引用对象g 的左值转换为指向g 的第一个元素的int* 类型的右值。
这种转换发生在多个地方。事实上,当您执行g[0] 时,它就会发生。数组索引运算符实际上不适用于数组,仅适用于指针。因此,int x = j[0]; 语句有效,因为 g[0] 恰好进行了与 j 初始化时相同的隐式转换。
指向数组的指针是这样声明的
int (*k)[2];
你是完全正确的关于如何使用它
int x = (*k)[0];
(注意"declaration follows use",即声明类型变量的语法如何模仿使用该类型变量的语法。)
但是,通常不使用指向数组的指针。围绕数组的特殊规则的全部目的是让您可以像使用数组一样使用指向数组元素的指针。所以惯用的 C 通常不关心数组和指针不是一回事,而且规则阻止你直接对数组做很多有用的事情。 (例如,您不能复制数组,例如:int g[2] = {1,2}; int h[2]; h = g;)
例子:
void foo(int c[10]); // looks like we're taking an array by value.
// Wrong, the parameter type is 'adjusted' to be int*
int bar[3] = {1,2};
foo(bar); // compile error due to wrong types (int[3] vs. int[10])?
// No, compiles fine but you'll probably get undefined behavior at runtime
// if you want type checking, you can pass arrays by reference (or just use std::array):
void foo2(int (&c)[10]); // paramater type isn't 'adjusted'
foo2(bar); // compiler error, cannot convert int[3] to int (&)[10]
int baz()[10]; // returning an array by value?
// No, return types are prohibited from being an array.
int g[2] = {1,2};
int h[2] = g; // initializing the array? No, initializing an array requires {} syntax
h = g; // copying an array? No, assigning to arrays is prohibited
因为数组与 C 和 C++ 中的其他类型非常不一致,所以您应该避免使用它们。 C++ 的std::array 更加一致,当您需要静态大小的数组时应该使用它。如果您需要动态大小的数组,您的第一个选择是 std::vector。