通过指针的数组迭代

问题描述:

所以我是一个初学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); 
} 
+1

想一想'pntr'一旦'pntr'不再指向您的任何值 –

+1

因为您调用了未定义的行为。 “int”数组不需要以null结尾,所以不需要满足“for”循环终止条件。 –

这是正确的代码

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'})。

+0

感谢您的回应,这绝对清除了我的事情。通过谷歌搜索我能找到的大部分都是参考char数组,所以我可以看到我在这里感到困惑。 – JIPtheVIP

+0

如果答案对您有帮助,您可以点击答案旁边的复选标记将其选为“接受答案” – stackptr

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,只要您使用的值是不可能发生的数组中) 。

在这两种解决方案中,最好的方法就是考虑数组的大小。