所以我是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);
}
答案 0 :(得分:3)
这是正确的代码
void walk(const int *arr, size_t n)
{
int *p;
for (p = arr; p < arr + n; ++p)
printf("%d\n", *p);
}
这是因为arr + n
从n
的基地址获取arr
整数的地址。
此外,int
数组不会以空值终止;只有char
数组与引号一起使用。("abc"
而不是{'a', 'b', 'c'}
)。
答案 1 :(得分:1)
这个for
循环:
for (int *pntr = li; *pntr; pntr++) {
printf("%d\n", *pntr);
}
...期望数组为零终止。通过使用*pntr
作为测试,您可以测试pntr
指向的值不为零。因此,如果数组没有以零结束,那么你的循环将在数组的末尾漂移,直到它碰巧达到零或导致段错误。
答案 2 :(得分:0)
您的代码总体上并不差,但它缺少一个主要因素:工作结束条件。
在你的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
,只要您使用的数值不太可能在您的数组中发生。)
在这两种解决方案中,最好的方法是考虑你的数据大小。