通过指针迭代数组

时间:2016-03-07 19:57:02

标签: c

所以我是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);
}

3 个答案:

答案 0 :(得分:3)

这是正确的代码

void walk(const int *arr, size_t n)
{
    int *p;

    for (p = arr; p < arr + n; ++p)
        printf("%d\n", *p);
}

这是因为arr + nn的基地址获取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,只要您使用的数值不太可能在您的数组中发生。)

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