在不知道大小的情况下打印数组

时间:2013-12-03 18:35:34

标签: c function pointers

我有这个功能:

int printArray(int* arr, int size) {

    int i = 0;
    while (size--) {
        printf("%d, ", *(arr + i++));
    }

    return EXIT_SUCCESS;
}

如何在不使用尺寸参数的情况下打印数组?

L.E。我试着做这样的事情:

int printArray(int* arr) {

    int i = 0;
    while (*(arr + i)) {
        printf("%d, ", *(arr + i++));
    }

    return EXIT_SUCCESS;
}

但每个输出后跟三个未知值:( in :1 2 3 4; out :1 2 3 4 343443 -432244 324333)。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以将地址传递给最后一个元素:

int printArray(int* arr, int* end) {

    do {
        printf("%d, ", *arr);
    } while( (arr++) != end);

    return EXIT_SUCCESS;
}

答案 1 :(得分:1)

添加标记值。您知道的值始终是最后一个值。对于整数很难,但-1和0是最喜欢的值。

答案 2 :(得分:1)

数组只是一系列连续的内存位置。为了遍历一个数组,你需要知道两件事,起始地址和如何找到结束。

可以通过几种方式找到结束,您需要给出:

  1. 显式结束地址
  2. 数组的长度
  3. 用于标记序列结束的标记值
  4. 在您第一次尝试时,printArray(int* arr, int size)正在使用第二种机制并从开始到结束递增内存位置。

    您的第二次尝试printArray(int* arr)只是说“打印直到找到0”。如果您有一个字符串(char数组以空终止符结束),但是您有一个int数组,这个想法就可以了。无法保证该列表中有0,因此您只需继续读取越来越多的内存位置,直到最终得到0。

    编写程序非常类似于正常的人类思维过程。简单阅读您的代码,看看它是否有意义:

    int in[4] = {1, 2, 3, 4};  // I have an array called in, it has 4 numbers: 1, 2, 3, 4
    int ret = printArray(in);  // I pass that array to the function printArray
    
    ...
    while (*(arr + i)) {       // while the contents of the memory location (array + i) is
                               // not 0, print the value we find there
    

    突然间,为什么这不起作用变得非常明显。您的数组是否包含数字0?不......那么什么时候会停止打印?