通过指向其元素的指针修改数组的元素
Modifying elements of an array through a pointer to its elements
给定代码:
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
已经指向了第一个循环的末尾vector
.
因此,在第二个 for
循环中打印的所有值都表示存储在数组边界外地址中的剩余值,经典 undefined behavior.
快速解决方法是在两个周期之间重置指针:
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) 现在指向的是数组大小(向量)的 out-of-bounds
由于您在第二个 for 循环中使用相同的指针变量来打印数组(向量)值,因此会打印垃圾值。
您可以通过将指针变量 (pv) 重新分配回数组的第一个位置来解决此问题
pv= vector;
// or
pv = &vector[0];
在你的第二个 for 循环之前。
给定代码:
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
已经指向了第一个循环的末尾vector
.
因此,在第二个 for
循环中打印的所有值都表示存储在数组边界外地址中的剩余值,经典 undefined behavior.
快速解决方法是在两个周期之间重置指针:
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) 现在指向的是数组大小(向量)的 out-of-bounds 由于您在第二个 for 循环中使用相同的指针变量来打印数组(向量)值,因此会打印垃圾值。
您可以通过将指针变量 (pv) 重新分配回数组的第一个位置来解决此问题
pv= vector;
// or
pv = &vector[0];
在你的第二个 for 循环之前。