指针弄乱了数组元素的地址

时间:2014-07-13 17:56:07

标签: c++ arrays pointers

好的,首先让我提供2个程序:

计划1:

#include <iostream>

using namespace std;

int main()
{
    int a[5], i;
    int *ptr;

    ptr = a;

    cout << "Enter the elements of the array:" << endl;
    for (i = 0; i < 5; i++)
    {
        cin >> a[i];
    }

    cout << endl;

    cout << "*ptr:";
    for ( i=0 ; i<5 ; i++ )
    {
        cout << *ptr ;
        *ptr++ ;
    }

    cout << "&a[i]:" << endl ;
    for (i = 0; i < 5; i++)
    {
        cout << &a[i] << endl;
    }

    cout << endl ;

    cout << "ptr:" << endl;
    for (i = 0; i < 5; i++)
    {
        cout << (ptr+i) << endl;
    }

    return 0;
}

输出:

  

输入数组的元素:1 2 3 4 5
  * ptr:12345

     

&安培; A [1]:
  0018FF30
  0018FF34
  0018FF38
  0018FF3C
  0018FF40

     

PTR:
  0018FF44
  0018FF48
  0018FF4C
  0018FF50
  0018FF54

计划2:

#include <iostream>

using namespace std;

int main()
{
    int a[5], i;
    int *ptr;

    ptr = a;

    cout << "Enter the elements of the array:" << endl;
    for (i = 0; i < 5; i++)
    {
        cin >> a[i];
    }

    cout << endl;

    cout << "*ptr:" << endl ;
    for ( i=0 ; i<5 ; i++ )
    {
        cout << *(ptr+i) ;
    }

    cout << "&a[i]:" << endl ;
    for (i = 0; i < 5; i++)
    {
        cout << &a[i] << endl;
    }

    cout << endl ;

    cout << "ptr:" << endl;
    for (i = 0; i < 5; i++)
    {
        cout << (ptr+i) << endl;
    }

    return 0;
}

输出:

  

输入数组的元素:1 2 3 4 5

     

* ptr:12345

     

&安培; A [1]:
  0018FF30
  0018FF34
  0018FF38
  0018FF3C
  0018FF40

     

PTR:
  0018FF30
  0018FF34
  0018FF38
  0018FF3C
  0018FF40

从上面的程序中,我们可以看到两种情况下的 * ptr 都显示相同的输出。

我知道程序2中的代码是处理指针时正确的递增方式。

但是,两个程序中的 ptr 都不相同。我很确定在程序1中用于显示 * ptr 的for循环是造成这种混乱的原因。我想知道for循环中发生了什么,以便在程序1中显示 * ptr ,因为 ptr 会受到影响。

5 个答案:

答案 0 :(得分:2)

第一个程序ptr正在修改自己 请注意,*ptr++;相当于*(ptr++);,相当于

*ptr;
ptr++;  

i循环中将ptr添加到for会使ptr指向其他位置,未分配的内存位置,而不是a的元素。这就是为什么你得到的地址不同于第一个程序中数组元素地址的地址。

答案 1 :(得分:1)

在第一个程序中,您修改了ptr,然后在第三个循环中将值添加到其地址,而不重置为数组的开头。

第二个循环修改ptr

的值
for ( i=0 ; i<5 ; i++ )
{
    cout << *ptr ;
    *ptr++ ;
}

然后在第四个循环中,将值添加到其地址,而不将其重置回数组的开头。

cout << "ptr:" << endl;
for (i = 0; i < 5; i++)
{
    cout << (ptr+i) << endl;
}

每次迭代时,只添加一次,但每次输出的值大四,因为单位增量是int的大小。

答案 2 :(得分:1)

此循环后

   for ( i=0 ; i<5 ; i++ )
    {
        cout << *ptr ;
        *ptr++ ;
    }

在第一个程序中,ptr指向数组的最后一个元素,因为在循环内部ptr增加了。要获得与第二个程序相同的结果,您必须将指针重置为指向此循环后数组的第一个元素

   for ( i=0 ; i<5 ; i++ )
    {
        cout << *ptr ;
        *ptr++ ;
    }

   ptr = a;

答案 3 :(得分:0)

在第一个程序中,您正在更新指针(更改指针所持有的地址)。因此,在循环之后,指针指向超出数组的最后一个地址

        *ptr++ ;

在第二个程序中,您没有更新指针中包含的地址。

*(ptr+i)

答案 4 :(得分:0)

好的,只是澄清一件事。

将指针递增为应该添加到指针没有任何问题。递增指针与迭代器后面的概念相同,并且在现有代码中广泛使用。