好的,首先让我提供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
0018FF40PTR:
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
0018FF40PTR:
0018FF30
0018FF34
0018FF38
0018FF3C
0018FF40
从上面的程序中,我们可以看到两种情况下的 * ptr 都显示相同的输出。
我知道程序2中的代码是处理指针时正确的递增方式。
但是,两个程序中的 ptr 都不相同。我很确定在程序1中用于显示 * ptr 的for循环是造成这种混乱的原因。我想知道for循环中发生了什么,以便在程序1中显示 * ptr ,因为 ptr 会受到影响。
答案 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)
好的,只是澄清一件事。
将指针递增为应该添加到指针没有任何问题。递增指针与迭代器后面的概念相同,并且在现有代码中广泛使用。