如何声明和初始化指向char的指针数组的指针数组?

时间:2019-05-03 16:12:29

标签: c arrays pointers declaration

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

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

请写出正确的声明和初始化表格? 我收到诸如“警告:标量初始值设定项大括号”之类的警告消息 以及“注意:(在'array [0]'的初始化附近”)

2 个答案:

答案 0 :(得分: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;
}

当然,这比2D矩阵更灵活:每个内部数组可以具有不同的大小,例如:

#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;
}

输出:

car toy game 
go play 
read 

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

答案 1 :(得分:0)

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

编译时没有警告。

它不是嵌套数组,而是指向&(char * []`)数组的指针(char*)的数组,所以我认为没有复合文字或单独的符号就无法做到数组对象以使数组指针失效。

(不要忘记从字符串文字中分配给char*是一种不好的做法,因为字符串文字实际上是(尽管不是正式的) char const [] , so using char const * instead of字符*`为佳。)