c - 表示多维数组或多指针的结尾

标签 c

<分区>

对于单个(字符串)数组,结尾用\0 表示。例如,如果我创建字符串:

char * string = "hello";

它将表示为 {'h','e','l','l','o','\0'}

像下面这样的数组如何表示“它的结束”?

char * strings[] = {"one", "two"};

在遍历循环时,如何检测数组的“结尾”?

最佳答案

你可以做这样的事情,这非常类似于字符串的空终止:

char * strings[] = {
    "one",
    "two",
    NULL
};

您可以使用这样的循环打印这些字符串:

char **pp;
for(pp = strings; pp != NULL; pp++)
    printf("%s\n", *pp);

但是当我说“你可以做到”时,我是认真的。没有规则规定您必须这样做。 (这与字符串本身形成对比,如果您构造自己的字符串并且希望您的字符串与 strcpyprintf 等)

我展示的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 并像那样划分是一个非常常见且完全合法的惯用语,但它有点晦涩难懂,所以我更喜欢用宏封装它(并使其更加 self 记录) ,像这样:

#define SIZEOFARRAY(a) (sizeof(a) / sizeof(a[0])

int nstrings = SIZEOFARRAY(strings);

关于c - 表示多维数组或多指针的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57897755/

相关文章:

c - 检测我的 C 源代码中的冗长(行数)函数

c - int_least16_t 是否有可能成为 int 而不是 short 的别名?

c - C 中哈希的哈希

c - 给定一个音频流,找到关门的时间(声压级计算?)

c - 如何使用 fscanf() 逐行读取 C 中的某个文件而不会出现幻象行?

java - 如何让 printf %x 类似于 python

c - 什么是c中的省略号运算符

c - 更多级别的间接对 C 中的性能有影响吗

c11 _Generic 添加类型

c - unsigned int 的按位否定运算符