const char** list_entry[] =
{
(const char*[]){"ent1", "ent2", "ent3", "ent4"},
(const char*[]){"ent1", "ent2", "ent3", "ent4"}
};
我不太明白,因为我想不出只有一个“*”而不是 2 个我无法完成的任何事情。
做这样的事情的主要关注点/优势是什么?
const char** list_entry[] =
{
(const char*[]){"ent1", "ent2", "ent3", "ent4"},
(const char*[]){"ent1", "ent2", "ent3", "ent4"}
};
我不太明白,因为我想不出只有一个“*”而不是 2 个我无法完成的任何事情。
做这样的事情的主要关注点/优势是什么?
在这份声明中
const char** list_entry[] =
{
(const char*[]){"ent1", "ent2", "ent3", "ent4"},
(const char*[]){"ent1", "ent2", "ent3", "ent4"}
};
有两个复合词;文字
(const char*[]){"ent1", "ent2", "ent3", "ent4"},
(const char*[]){"ent1", "ent2", "ent3", "ent4"}
根据声明发生的位置具有自动或静态存储持续时间。
如果没有复合文字,您将需要定义两个单独的指向字符串文字的指针命名数组,然后list_entry
使用这些命名数组进行声明。
这是一个演示程序,它显示list_entry
了使用复合文字和不使用复合文字定义数组的两种替代方法。
#include <stdio.h>
int main(void)
{
{
const char** list_entry[] =
{
(const char*[]){ "ent1", "ent2", "ent3", "ent4", "" },
(const char*[]){ "ent1", "ent2", "ent3", "ent4", "" }
};
size_t N = sizeof( list_entry ) / sizeof( *list_entry );
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; list_entry[i][j][0] != '\0'; j++ )
{
printf( "%s ", list_entry[i][j] );
}
putchar( '\n' );
}
}
putchar( '\n' );
{
const char *list1[] = { "ent1", "ent2", "ent3", "ent4", "" };
const char *list2[] = { "ent1", "ent2", "ent3", "ent4", "" };
const char** list_entry[] = { list1, list2 };
size_t N = sizeof( list_entry ) / sizeof( *list_entry );
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; list_entry[i][j][0] != '\0'; j++ )
{
printf( "%s ", list_entry[i][j] );
}
putchar( '\n' );
}
}
return 0;
}
它的输出是
ent1 ent2 ent3 ent4
ent1 ent2 ent3 ent4
ent1 ent2 ent3 ent4
ent1 ent2 ent3 ent4
从第二个代码片段可以清楚地看出,例如数组list1
const char *list1[] = { "ent1", "ent2", "ent3", "ent4", "" };
是一个指向字符串字面量第一个字符的指针数组。(注意:表达式中使用的数组指示符除了极少数例外会被转换为指向它们的第一个元素的指针。字符串文字是字符数组。)
这个指针数组在声明中用作初始化器list_entry
const char** list_entry[] = { list1, list2 };
也转换为指向其第一个元素的指针。因此,由于 list1 的元素具有 type ,const char *
那么指向其第一个元素的指针将具有 type const char **
。