你可以做这样的事情,这非常类似于字符串的空终止:
char * strings[] = {
"one",
"two",
NULL
};
您可以使用这样的循环打印这些字符串:
char **pp;
for(pp = strings; pp != NULL; pp++)
printf("%s\n", *pp);
但当我说“你能做到”时,我是认真的。没有规定说您必须这样做。 (这与字符串本身形成对比,如果您构建自己的字符串并且希望自己的字符串与strcpy、printf 等兼容,则确实必须使用空字符终止。)
我展示的NULL 终结点适用于指针数组。为其他类型选择合适的标记值可能更难,例如int 的数组。 (如果你知道你的数字都是正数,你可以使用 0 或 -1 作为哨兵,但如果你的数组有正数和负数,你可能会卡住。)
另一种可能性是保持单独的计数:
char * strings[] = {
"one",
"two"
};
int nstrings = 2;
int i;
for(i = 0; i < nstrings; i++)
printf("%s\n", strings[i]);
与其手动计算字符串并将nstrings 显式初始化为2,不如让编译器为您完成这项工作:
int nstrings = sizeof(strings) / sizeof(strings[0];
sizeof(strings) 以字节为单位为您提供整个数组的大小,而sizeof(strings[0]) 以字节为单位为您提供一个元素的大小(即一个指针),因此除法为您提供了条目数,这就是你想要的。
使用sizeof 并像这样划分是一个非常常见且完全合法的习语,但它有点晦涩难懂,所以我更喜欢用一个宏来封装它(并使其更具自我记录性),如下所示:
#define SIZEOFARRAY(a) (sizeof(a) / sizeof(a[0])
int nstrings = SIZEOFARRAY(strings);