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]。