使用 c while 循环遍历所有整数数组元素

Looping all integer array elements using c while loop

本文关键字:整数 数组元素 遍历 while 循环 使用      更新时间:2023-10-16

>我正在尝试使用指针循环整数数组,但我得到一个奇怪的值。

int nums[1] = { 1 };
int *p = nums;
while(*p != NULL) {
    cout << " LOOPING, p is " << *p << endl;
    p++;
}

当我运行时,我得到下一个输出:

 LOOPING, p is 1
 LOOPING, p is -858993460
 LOOPING, p is 4454504
 LOOPING, p is 3032019

为什么我会得到这些奇怪的价值观?我应该只看到"1",因为我一直在循环,直到我得到 NULL 指针,并且在每个循环中我移动下一个指针。

while(*p != NULL) {

比较是错误的,原因有二:

  • *p是一个整数,而不是NULL暗示的指针
  • 数组不是以 0 结尾的,所以即使NULL被视为花哨的 0,它也不会起作用

你可以试试:

int nums[] = {1, 0};
while(*p)

你正在超越数组的边界并查看垃圾值。您的数组大小为 1,包含 1 .因此,同时的条件没有得到满足(或者在某些时候它纯粹是偶然的)。

你的条件是错误的,指针在数组的末尾不会为 NULL,所以正在发生的事情是你超出了数组边界。

此外,使用指针上的*获取它指向的内存中的值。因此,在您的情况下*p意味着"取 p 指向的值"。

其他答案已经涵盖了为什么你的代码不起作用 - 只是想添加另一个循环选项:

int main()
{
    int nums[] = { 1, 5, 7 };
    int *pEnd = nums + sizeof(nums)/sizeof(int) - 1; // point to last element
    int *p = nums;
    while(p <= pEnd) {
        cout << " LOOPING, p is " << *(p++) << endl;
    }
    return 0;
}
int GetSize(int a[]){
    int ptr=0;
    while(a[ptr]!= NULL){
        ptr++;
    }
    return --ptr;
}

同时您可以尝试以下代码:

int nums[] = {1, 0};
int *p = nums;
while(*p){
    cout << *p;
    p++;
}

请注意,如果您决定在零之后向数组中添加更多数字,则在迭代时将无法识别它们。

nums[] = {1, 0, 1, 2}

只会返回

1

对于 int 数组,我们可以将指针变量指向该数组的最后一个的方法是这样做。x = base_address + sizeof(arr)/sizeof(int) -1;"-1"用于添加两倍的基址。所以如果我们这样做p = x;p 将指向数组的结束元素。

这就像按索引访问数组元素一样。