0

作为 C++ 的初学者,我正在努力理解指针和数组。我写了以下程序:

int main (void){
int p[3]={0};
int * iptr = new int [4];

iptr++;
*iptr=2;
iptr++;
*iptr=3;

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}

return 0;
}

但是我没有得到预期的结果。我本来希望元素 [1] 和 [2] 分别具有值 2 和 3。但是我得到的结果如下:

iptr: 3
iptr: -842150451
iptr: -33686019
iptr: 0

有人可以告诉我我的理解哪里出错了吗?

谢谢丹

4

4 回答 4

6

作为 C++ 的初学者,我正在努力理解指针和数组

任何人都可以给你的最好建议:不要。指针和数组不值得努力。使用像std::vectoror这样的 C++ 工具std::array,您的生活将变得无比轻松。如果你需要的话,在掌握了其余的语言之后再回来学习它们。

于 2012-04-12T16:03:43.453 回答
5

问题在这里:

int * iptr = new int [4];

iptr++;
*iptr=2;
iptr++;
*iptr=3;

调用后iptr++iptr将不再指向数组的开头。设置值后,应重置iptr为原始位置 ( iptr -= 2) 或使用辅助指针。

所以2个可能的解决方案:

iptr++;
*iptr=2;
iptr++;
*iptr=3;

iptr -= 2;

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}

或(清洁工):

int* aux = iptr;
aux++;
*aux=2;
aux++;
*aux=3;

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}
于 2012-04-12T15:59:57.070 回答
1

你已经跑过了数组的末尾。您正在打印的内容可能恰好在内存中,但从技术上讲,这是未定义的行为。

iptr是指向 4 个元素的数组的第一个元素的指针:

int * iptr = new int [4];

iptr指向此之后的第二个元素:

iptr++;
*iptr=2; // set second element to 2

iptr指向之后的第三个元素:

iptr++;
*iptr=3; // set third element to 3

这里什么都没有 reset iptr,所以它仍然指向第三个元素。

for (int i=0;i<4;i++){
    cout << "iptr: " << *iptr << endl;
    iptr++;
}

所以你打印:

第三个元素,设置为三个:

iptr: 3

第四个元素,未由您的程序设置为任何特定值

iptr:-842150451

在这里结束,未定义的行为,但可能您的实现只是打印附近的内存。

iptr:-33686019
iptr: 0
于 2012-04-12T15:59:37.227 回答
1

指针不会自动返回到您最初设置它们的位置。使用后

iptr++;

它现在指向新地址,即元素[2]

对于循环,使用另一个临时指针。不要增加原来的。看这个:

int arr[4];

int* iptr = arr;

iptr++; 
iptr = 2;
iptr++; 
iptr = 3;

for (int i=0;i<4;i++){
    cout << "arr: " << arr[i] << endl;        
}
于 2012-04-12T16:02:09.637 回答