c-遍历已分配的数组



假设我想打印int类型数组的值。

int *num = malloc(5 * sizeof(int));

我该怎么做?很明显,在我完成了所有我设定的价值观之后,我想停下来,其中有5个

注意,我不想做这样的事情:

for (int i=0;i<5;i++)

我想知道我举的例子中发生了什么

while(*num) {
   printf("%d", *num);
   num++;
}

while(num != NULL) {
       printf("%d", *num);
       num++;
    }

C中的数组不携带长度。您必须将长度与数组一起传递。

最简单的方法是使用变量:

int i;
for (i = 0; i < 5; ++i)
    printf("%d ", num[i]);

NUL结尾的特技通常只用于字符串,字符串的结尾用NUL字符('')标记。当然,如果您自己构建和使用阵列,没有什么可以阻止您制定类似的约定。例如,您可以用-1:标记数组的末尾

int *num = malloc(5 * sizeof(int));
num[4] = -1;
int *p;
for (p = num; *p != -1; ++p)
    printf("%d ", *p);

当您以显示的方式使用分配的数组时

int *num = malloc(5 * sizeof(int));

那么知道结束的唯一方法就是使用用于分配数组的大小。像

int i = 0;
while(i < 5)  // 5 here is the size used wile allocating
{
   printf("%d", num[i]);
   i++;
}

您需要将数组的长度存储在某个位置。其他一些策略是在数组末尾放置终止符哨兵值(尽管该值对实际内容无效):

int *num = calloc(6, sizeof(int));
num[5] = -1;
int i;
for (i = 0; num[i] != -1; i++) {
    //...
}

或者嵌入数组的长度作为其第一个元素:

int *num = malloc(6 * sizeof(int));
int len = num[0];
int i;
for (i = 1; i < len; i++) {
    // ...
}

(注意,灵活阵列是表示第二个示例的更好方式)

以上两个都展示了如何将长度存储在数组本身中,并为此目的使用额外的元素。

while(*num) {
   printf("%d", *num);
   num++;
}

这个过程一直持续到*num为零。如果没有有效的条目可以包含零,并且您已将最后一个条目(或第一个无效条目)设置为零,则此操作正常。这被称为sentinel值。

while(num != NULL) {
       printf("%d", *num);
       num++;
    }

这行不通。增加num不会使其成为NULL。为什么会这样?

如果要输出特定数量的值,则有两个基本选择。您可以将要输出的值的数量传递给输出代码,并在输出该数量的值时进行计数。或者,您可以使用"sentinel"值来标记结束。如果零不是您想要打印的有效值,则可以使用零作为哨兵。别忘了为哨兵分配空间。

相关内容

  • 没有找到相关文章

最新更新