List1
是由两个数组组成的数组 10 const char
。&List1
指向两个 10 数组的数组的指针也是如此char
。如果var_name
是一个数组,它是一个指针数组,指向一个由两个数组组成的数组 10 const char
。您可以逐个构建该声明:
var_name
是一个数组…… var_name[]
:。
- ……指针:
*var_name[]
。
- ……到两个数组……
(*var_name[])[2]
:。
- ……10 个数组……
(*var_name[])[2][10]
:。
- ……
const char
:。const char (*var_name[])[2][10]
_
然后你可以定义和初始化它:
char (*var_name[])[2][10] = { &List1, &List2, &List3, &List4};
"Book"
在元素 1 中List3
,在元素 2 中var_name
,所以可以用(*var_name[2])[1]
.
请注意,这需要*
, 因为var_name[i]
是一个指针。这遵循您提供的示例代码,其中数组初始化为&List1
. 使用指向数组第一个元素的指针而不是指向数组的指针更为常见。(内存中的地址相同,但类型不同。)
假设我们想消除这个不必要的指针级别并var_name
用初始化{ List1, List2, List3, List4 }
。与 C 中的往常一样,这些数组将自动转换为指向其第一个元素的指针。每个数组的第一个元素是 10 的数组const char
。因此,我们将var_name
使用指向 10 数组的指针进行初始化const char
。
因此,var_name
将是一个指向 10 数组的指针数组const char
。同样,我们可以逐个构建声明:
var_name
是一个数组…… var_name[]
:。
- ……指针……
*var_name[]
:。
- ...到10个数组...:
(*var_name[])[10]
。
- ……
const char
:。const char (*var_name[])[10]
_
那么定义和初始化就是:
const char (*var_name[])[10] = { List1, List2, List3, List4 };
现在 的 元素List3
都指向 了var_name[2]
,所以我们可以参考"Book"
with var_name[2][1]
。