【问题标题】:Is char** a pointer to an array of strings in C?char** 是指向 C 中字符串数组的指针吗?
【发布时间】:2019-04-30 02:44:52
【问题描述】:

据我了解,char* X是C中指向单个字符或字符数组(字符串)的变量。

char**是指向另一个指针的指针,该指针最终指向单个字符或字符数组。

如果int**相当于创建一个多维数组,为什么我不能在C中使用char**创建一个字符串数组?

const char** day = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};

这里*day 将指向数组本身,**day 将指向数组“Sunday”的第一个元素?

【问题讨论】:

  • @RonaldoAraújoAlves 我们不要在这里将 ppl 与 Objective-c 混淆
  • int ** 不是二维数组的等价物——远非如此

标签: c arrays pointers


【解决方案1】:

为什么我不能在 C 中使用 char** 创建一个字符串数组? 是的,你可以创建。正确的方法是使用 char 指针数组 而不是像您那样使用双 char** 指针。例如

const char* day[7] = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};

如上,day字符指针数组,它的每个元素都是字符指针,每个元素都需要指向有效的地址。这里day[0] 是字符指针,它指向字符串文字sunday,这是有效的地址。

也可以通过char** 进行,但不像您那样。例如

char **day = {"sunday", "Monday" };

这里的问题是你没有为day[0]day[1] 分配内存来保存一些字符串文字,比如sunday 等等。

首先为day 分配内存,如下所示

char **day = malloc(NUM_OF_DAYS * sizeof(*day)); /* define NUM_OF_DAYS as 7 */

然后为day[0]day[1]等分配内存

for(int index =0 ; index < NUM_OF_DAYS; index++) {
   day[index] = malloc(MAX_DAY_SIZE * sizeof(**day)); /* define this MACRO */
}

然后您在运行时扫描数据。

【讨论】:

    【解决方案2】:

    char* X是C中指向单个字符或字符数组(字符串)的变量。

    不,它是一个包含单个字符的地址的变量。该单个字符可能是也可能不是以空字符结尾的字符串的开头。

    因此char** 指向一个char*,该char* 指向一个字符。

    如果int**相当于创建一个多维数组

    事实并非如此。 int** 与多维数组无关。

    为什么我不能在 C 中使用 char** 创建一个字符串数组?

    因为char** 不是数组,严格来说,它也不能指向一个。


    char* 可用于指向以空字符结尾的字符串。所以如果你想要一个字符串数组,你需要一个char* 的数组。例如可以写成:

    char* day[] = { ... };
    

    现在事实证明,char** 可用于指向该数组的第一项地址,&amp;day[0],因为那是char*。这常常让人把char** 混淆为多维数组,因为这样做是有效的:

    char* day[] = { "Sunday", ... };
    char** week = &day[0];
    printf("%c", week[0][0]); // prints 'S'
    

    但这不会使char** 成为一个数组,也不会使它成为一个二维数组。

    您也可以使用char** 动态分配字符串查找表,其中每个字符串都有可变长度:

    char** week = malloc(7 * sizeof(char*));
    for(int i=0; i<7; i++)
    {
      week[i] = malloc( ... );
    }
    

    这里char** 再次指向char* 的一维数组的第一项。它不是一个二维数组,它不指向一个。它允许week[i][j] 语法是无关紧要的,它仍然不是一个数组([] 从未实际用于数组类型,Do pointers support “array style indexing”?)。

    更多信息:Correctly allocating multi-dimensional arrays

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 2021-01-26
      • 2021-06-28
      • 2021-07-28
      • 2012-03-19
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多