【问题标题】:How to declare and initialize an array of pointers to array of pointers to char?如何声明和初始化指向 char 指针数组的指针数组?
【发布时间】:2019-05-03 16:12:29
【问题描述】:

我想声明一个指向 char 指针数组的指针数组并对其进行初始化。但我无法使用以下方式声明和初始化它:

char *(*array[])[] = {
  { "car", "toy", "game" },
  { "go", "play", "read" }
};

请写出我的声明和初始化的正确形式? 我收到警告消息,例如“警告:标量初始值设定项大括号” 还有“注意:('array[0]'的初始化附近)”

【问题讨论】:

  • 您拥有的初始化程序是一个由两个数组组成的数组,该数组包含三个指向(只读)字符的指针。可选地,它可以是由三个 X 字符数组组成的两个数组的数组(其中 X 大到足以容纳最大的字符串)。
  • cdecl.org 中发现了一个错误——char *(*array[])[] 不起作用,因为它不处理单词数组。 char *(*Array[])[] 确实如此。 cdecl.org/?q=char+*%28*Array%5B%5D%29%5B%5D%3B

标签: c arrays pointers declaration


【解决方案1】:

在 C99 之前,您必须单独定义内部数组:

#include <stdio.h>

int main() {
    const char *array_0[] = { "car", "toy", "game" };
    const char *array_1[] = { "go", "play", "read" };
    const char **array[] = { array_0, array_1 };
    int i, j;

    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            printf("%s ", array[i][j]);
        }
        printf("\n");
    }
    return 0;
}

使用 C99,您现在可以直接定义和初始化同一个对象:

#include <stdio.h>

int main() {
    const char **array[] = {
        (const char *[]){ "car", "toy", "game" },
        (const char *[]){ "go", "play", "read" },
    };

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%s ", array[i][j]);
        }
        printf("\n");
    }
    return 0;
}

当然这比二维矩阵更灵活:每个内部数组可以有不同的大小,如下所示:

#include <stdio.h>

int main() {
    const char **array[] = {
        (const char *[]){ "car", "toy", "game", NULL },
        (const char *[]){ "go", "play", NULL },
        (const char *[]){ "read", NULL },
        NULL,
    };

    for (int i = 0; array[i]; i++) {
        for (int j = 0; array[i][j]; j++) {
            printf("%s ", array[i][j]);
        }
        printf("\n");
    }
    return 0;
}

输出:

汽车玩具游戏 去玩 读

请注意,我添加了 const 关键字,因为不应修改字符串文字,因此应将指向它们的指针定义为 const char *

【讨论】:

    【解决方案2】:
    char *(*array[])[] = {
        &(char*[]){"car","toy","game" },
        &(char*[]){"go","play","read" }
    };
    

    编译时没有警告。

    它不是嵌套数组,它是指向char* (char*[]`) 数组的指针数组 (&amp;) 所以我认为你不能没有复合文字或单独的数组对象来制作数组指针出来了。

    (不要忘记从字符串文字分配给char* 是一种不好的做法,因为字符串文字实际上是,虽然不是正式的char const[], so usingchar const*instead ofchar * ` 会更好。)

    【讨论】:

    • 请不要鼓励 OP... ;)
    • 这不起作用:array 不能用作指向char 的指针数组。 printf("%s ", array[i][j]); 产生错误:arrarr.c:22:35: error: subscript of pointer to incomplete type 'const char *[]'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2021-01-26
    相关资源
    最近更新 更多