强制转换匿名二维数组

bar*_*ool 4 c arrays pointers casting anonymous-arrays

是否可以创建这样的匿名数组?

char **values = (*char[]){"aaa", "bbb", "ccc"};

Run Code Online (Sandbox Code Playgroud)

此方法有效:

char **values
char *tmp[] = {"aaa", "bbb", "ccc"};
values = tmp;
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 5

是的,您可以使用复合文字来做到这一点(它创建一个可以获取其地址的匿名对象)。您只需要正确获取该复合文字的类型(在您的情况下它将是char*[]),然后使用&运算符获取其地址:

#include <stdio.h>

int main()
{
    // The outer brackets on the RHS are not necessary but added for clarity...
    char *(*values)[3] = &( (char* []) { "aaa", "bbb", "ccc" } );
    for (int i = 0; i < 3; ++i) printf("%s\n", (*values)[i]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以利用这样一个事实:数组(即使是定义为复合文字的数组)将自动“衰减”到指向其第一个元素的指针(在大多数情况下,包括用作赋值操作的 RHS 时):

int main()
{
    char** values = (char* []){ "aaa", "bbb", "ccc" };
    for (int i = 0; i < 3; ++i) printf("%s\n", values[i]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 除了问题中的拼写错误(“*char”而不是“char *”)之外,“char **”没有任何问题。复合文字 `(char *[]) {"aaa", "bbb", "ccc"}` 是一个数组,将自动转换为 `char **`。 (2认同)