通过指向数组元素的指针修改数组的元素

问题描述

给出代码

int vector[5] = {1,2,3,4,5};
int *pv = vector,value = 3;

for(int i = 0; i < 5; i++) {
    *pv++ *= value;
}

for(int i = 0; i < 5; i++) {
    printf("%d,",*(pv+i));
}

我希望pv指向的数组的每个元素都将乘以3。 相反,我得到的输出是:

32766,-1554513907,-527290408,-333409024,32766,

我在做什么错了?

解决方法

问题是您在每个循环的第一个for周期中都增加了指针,因此当到达末尾时,pv已经指向{{ 1}}。

因此,在第二个vector周期中打印的所有值均表示存储在经典undefined behavior数组边界之外的地址中的残差值。

一种快速的解决方法是在两个周期之间重置指针:

for

或者在两个周期中都使用 iterator for (int i = 0; i < 5; i++){ *pv++ *= value; } pv = vector; //here for (int i = 0; i < 5; i++) { printf("%d,",*(pv + i)); } ,因为您已经在i中使用它了,所以不妨使用它:

for

使用此方法时,指针不会递增,它始终指向数组的开头,因此安全地访问其索引。

请注意,我使用了数组表示法for (int i = 0; i < 5; i++){ pv[i] *= value; } for (int i = 0; i < 5; i++) { printf("%d,pv[i]); } ,因为它比指针取消引用表示法更加混乱。

,

在您的程序中,第一个for循环(即)

for(int i = 0; i < 5; i++) {
    *pv++ *= value;
}

这里,pointer(pv)增加了5倍,并且当控件退出循环时,pointer(pv)现在指向的对象超出了数组大小(向量) 由于您在第二个for循环中使用了相同的指针变量来打印array(vector)值,因此将打印出垃圾值。

您可以通过以下方法将指针变量(pv)重新分配回数组的第一位置来解决此问题

pv= vector;

// or

pv = &vector[0];

在第二个for循环之前。