假设我想打印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"值来标记结束。如果零不是您想要打印的有效值,则可以使用零作为哨兵。别忘了为哨兵分配空间。