使用C语言while循环遍历整数数组的所有元素

3
我正在尝试使用指针循环遍历整数数组,但我得到了一些奇怪的值。
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指针,每次循环我都移动下一个指针。

3
你似乎期望数组以NULL结尾,但事实并非如此。你可能会将此与字符串字面量混淆了吗? - Mysticial
是的,我对字符串字面值感到困惑了...有人能解释一下为什么我的声望会减少吗? - Yosi
2
有些人对看起来太基础的问题投票非常严厉。但这是一个有效的问题,所以这里给它点个赞。 - Mysticial
7个回答

8
while(*p != NULL) {
比较有两个错误:
  • *p是一个整数,不像NULL所暗示的那样是一个指针
  • 数组没有以0结尾,因此即使将NULL视为一个花哨的0,它也无法正常工作
你可以尝试:
int nums[] = {1, 0};
while(*p)

4

您正在超出数组边界并查看垃圾值。您的数组大小为1,包含1。因此,while中的条件未满足(或者可能在某个时刻由于纯粹的机会而得到满足)。


3
您的条件是错误的,在数组末尾指针不会为空,所以发生的情况是您超出了数组范围。 另外,在指针上使用 * 取出所指内存的值。 所以在您的情况下,*p 的意思是“取指针 p 所指向的值”。

2
其他答案已经解释了为什么你的代码不能工作 - 我只想为循环添加另一个选项:
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;
}

0

你可以尝试下面的代码:

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

请注意,如果您决定在零之后向数组添加更多数字,则在迭代时它们将不被识别。
nums[] = {1, 0, 1, 2}

will only return

1

0
int GetSize(int a[]){
    int ptr=0;
    while(a[ptr]!= NULL){
        ptr++;
    }
    return --ptr;
}

0
在处理整型数组时,我们可以通过以下方式将指针变量指向该数组的最后一个元素。 x = base_address + sizeof(arr)/sizeof(int) -1; “-1”是为了加上两次基地址。因此,如果我们执行 p = x; p将指向数组的最后一个元素。
这就像通过索引访问数组元素一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接