C 二维指针数组

C 二维指针数组,c,pointers,arrayofstring,C,Pointers,Arrayofstring,我正在处理一个需要以下内容的应用程序 const char List1[2][10] = {"Stack","Overflow"}; const char List2[2][10] = {"Goo","Gle"}; const char List3[2][10] = {"Face","Book"}; const char List4[2][10] = {"Pizza&

我正在处理一个需要以下内容的应用程序

const char List1[2][10] = {"Stack","Overflow"};
const char List2[2][10] = {"Goo","Gle"};
const char List3[2][10] = {"Face","Book"};
const char List4[2][10] = {"Pizza","Hutt"};
现在我必须将List1,…,List4存储到另一个数组中,如下所述

char **var_name[2][2] = { &List1, &List2, &List3, &List4};
我该怎么称呼“var_name”?&这条路对吗


另外,如果我想使用XYZ打印“Book”,那么如何打印它?

List1
是一个由两个数组组成的数组,每个数组包含10个
常量字符。因此,
&List1
是一个指针,指向一个由两个10
char
数组组成的数组。如果
var\u name
是这些数组的一个数组,那么它是指向两个数组(10
const char
的数组)的指针数组。您可以为该部分逐个构建声明:

  • var\u name
    是一个数组…:
    var\u name[]
  • …指针:
    *var\u 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”
位于
List3
的元素1中,它位于
var\u name
的元素2中,因此您可以使用
(*var\u name[2])[1]
引用它

请注意,这需要
*
,因为
var\u name[i]
是一个指针。下面是您给出的示例代码,其中数组是用
&List1
初始化的。更常见的做法是使用指向数组第一个元素的指针,而不是指向数组的指针。(内存中的地址相同,但类型不同。)

支持我们希望消除这个不必要的指针级别,并使用
{List1,List2,List3,List4}
初始化
var_name
。与C语言中的通常情况一样,这些数组将自动转换为指向其第一个元素的指针。每个数组的第一个元素都是一个10
const char
的数组。因此,我们将使用指向10个常量字符数组的指针初始化
var\u name

因此,
var\u name
将是指向10
const char
数组的指针数组。同样,我们可以一块一块地构建声明:

  • var\u name
    是一个数组…:
    var\u name[]
  • …指针的…:
    *变量名[]
  • …到10的数组…:
    (*var_name[])[10]
  • const char
    …:
    const char(*var_name[])[10]
那么定义和初始化是:

const char (*var_name[])[10] = { List1, List2, List3, List4 };
现在,
List3
的元素由
var\u name[2]
指向,因此我们可以使用
var\u name[2][1]
参考
“Book”