通过指针的数组迭代
问题描述:
所以我是一个初学C编程和理解指针,如何使用它们仍然给我一些麻烦。在这里,我只是试图通过使用指针来遍历数组。我已经得到了下面这段代码,但不是以55结尾,而是打印一个附加值(32765)。首先,有人可以向我解释为什么我会得到额外的价值吗?其次,有人能告诉我如何将这个程序限制在数组中的值吗?我尝试使用* pntr < 5作为条件,但是没有打印。通过指针的数组迭代
void iterate(int* li) {
for (int *pntr = li; *pntr; pntr++) {
printf("%d\n", *pntr);
}
}
int main(){
int values[] = {11, 22, 33, 44, 55};
iterate(values);
}
答
这是正确的代码
void walk(const int *arr, size_t n)
{
int *p;
for (p = arr; p < arr + n; ++p)
printf("%d\n", *p);
}
这是因为arr + n
得到的从arr
基地址n
整数地址。另外,int
数组不是空终止的;只有char
阵列与引号一起使用(而不是{'a', 'b', 'c'}
)。
答
这for
循环:
for (int *pntr = li; *pntr; pntr++) {
printf("%d\n", *pntr);
}
...期望阵列是零终止。通过使用*pntr
作为测试,您正在测试pntr
指向的值不为零。因此,如果数组不是以零结尾,则循环会在数组末尾飘移,直到遇到零或导致段错误。
答
你的代码总体不错,但它缺少一个主要因素:工作结束条件。
在您的for循环中,当您编写*pntr
时,结束条件将是循环在达到指向值0
时停止。但是,由于数组包含非零值,因此它将为您的数组获取超出分配内存的值。
幸运的是,你只能看到一个额外的价值,但你可能会看到更多的价值。
要修复缺失的结束条件,您有两种解决方案:要么使用您的iterate
函数共享阵列的长度,要么添加一个已知值为数组的最终值的值。
因此,无论你做:
void iterate(const int *arr, size_t n) {
for (it = arr; it < arr+n ; +=it) printf("$d\n", *it);
}
,或者你可以这样做:
#define LAST_ITEM -1
int values[] = {11, 22, 33, 44, 55, LAST_ITEM};
void iterate(const int *arr, size_t n) {
for (it = arr; *it != LAST_ITEM ; +=it) printf("$d\n", *it);
}
(你可以使用#define LAST_ITEM 0
,只要您使用的值是不可能发生的数组中) 。
在这两种解决方案中,最好的方法就是考虑数组的大小。
想一想'pntr'一旦'pntr'不再指向您的任何值 –
因为您调用了未定义的行为。 “int”数组不需要以null结尾,所以不需要满足“for”循环终止条件。 –