使用 while 迭代数组

问题描述 投票:0回答:1

我被下面的 while 循环困住了。

whille(*rtn)
只要第一个值为零(请参见下面的示例 0),

就被视为 false,因此程序不会进入 while 循环。如果我将第一个值更改为非零(示例 1),程序将进入 while 循环。如果我更改赋值,使第五个元素为零(示例 2),则 while 循环将在第五个元素处停止。 for 循环按预期工作。

    size_t sz = 100 ;                                                                                                                                                                                                                                                                             
    int *rtn = malloc(sz*sizeof(int));                                                                                                                             
    int cnt ;                                                                                                                                                      
                                                                                                                                                                   
    for(cnt = 0 ; cnt < sz ; cnt++){                                                                                                                               
 EXAMPLE 0 rtn[cnt] = cnt*2 ;        // First value of array is 0                                                                                                                                     
 EXAMPLE 1 rtn[cnt] = cnt*2 + 5 ;    // first value of array is non zero                                                                                                                                     
 EXAMPLE 2 rtn[cnt] = 5 - cnt ;      // fifth value will be 0                                                                                                                                     
    }                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                          
    cnt=0 ;                                                                                                                                                        
    printf("\n---WHILE LOOP---\n") ;                                                                                                                               
    while(*rtn){                                                                                                                                                   
        printf("%3d - %4d\n",cnt, *rtn) ;                                                                                                                          
        cnt++ ;                                                                                                                                                    
        rtn++ ;                                                                                                                                                    
    }                                                                                                                                                              
                                                                                                                                                                   
    printf("\n---FOR LOOP---\n") ;                                                                                                                                 
    for(cnt = 0 ; cnt < 10 ; cnt ++){                                                                                                                              
        printf("%3d - %4d\n", cnt, rtn[cnt]) ;                                                                                                                     
    }                                               
   

我认为 while 循环正在测试 NULL 指针而不是 0,这显然可以是一个有效值!? 另外,如果我将 while 循环更改为

while(rtn){
...
}

它只会遍历完整的内存(?)并以错误结束。所以本质上 while 循环不是迭代 int 数组的有效工具?!

c pointers while-loop
1个回答
0
投票

不清楚您在问题中问什么,但对于您提到的任一任务使用

while
循环或
for
循环没有任何问题。下面是使用任一元素迭代每个元素的示例。还有使用任一元素进行迭代直到找到“假”元素(如果没有“假”元素则可能超出范围)的示例。还有一个
while
循环的示例,它使用问题中的语法完成相同的事情

#include <stdio.h>
#include <stdlib.h>

int main() {
    int sz = 5; // I made this smaller for my example
    int* rtn = malloc(sz * sizeof(int));
    int cnt;

    // Populate some random data
    rtn[0] = 3;
    rtn[1] = 2;
    rtn[2] = 0;
    rtn[3] = 1;
    rtn[4] = 4;

    // If your goal is to iterate over every element this works
    printf("For every element\n");
    for (cnt = 0; cnt < sz; cnt++) {
        printf("%d\n", rtn[cnt]);
    }

    // If your goal is to iterate over every element this works too
    printf("While every element\n");
    cnt = 0;
    while (cnt < sz) {
        printf("%d\n", rtn[cnt]);
        cnt++;
    }

    // If your goal is to iterate until you find a "false" element this does
    // that BUT it will go out of bounds if there is no "false" element
    printf("For until \"false\" element\n");
    for (cnt = 0; rtn[cnt]; cnt++) {
        printf("%d\n", rtn[cnt]);
    }

    // If your goal is to iterate until you find a "false" element this does
    // that too. It also will go out of bounds if there is no "false" element
    printf("While until \"false\" element\n");
    cnt = 0;
    while (rtn[cnt]) {
        printf("%d\n", rtn[cnt]);
        cnt++;
    }

    // Yet another way to do the exact same as the previous while loop
    printf("Another while until \"false\" element\n");
    while (*rtn) {
        printf("%d\n", *rtn);
        rtn++;
    }

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.