为什么cout指针可以改变数据

时间:2015-04-14 11:41:16

标签: c++ pointers

#include <iostream>
using namespace std;
void reset(int *a, int *b){
    int sum = *a + *b;
    *a = (sum / 2.0 - sum / 2) >= 0.5 ? sum / 2 + 1 : sum / 2;
    *b = *a;
    cout << hex << (void *)a<<endl;
    cout << hex << b<<endl;
}
int main(){
    int a, b;
    cin >> a >> b;
    reset(&a, &b);
    cout << a <<' '<< b << endl;
}

我使用代码重置两个变量,但是在打印变量指针后,数据发生了变化。当我推荐两个cout语句时。它有效。 看起来像这样:
cout the pointer

not cout the pointer

2 个答案:

答案 0 :(得分:5)

您应该返回dec,因为您已将输出更改为hex

#include <iostream>
using namespace std;
void reset(int *a, int *b){
    int sum = *a + *b;
    *a = (sum / 2.0 - sum / 2) >= 0.5 ? sum / 2 + 1 : sum / 2;
    *b = *a;
    cout << hex; //set hex for output stream
    cout << (void *)a<<endl;
    cout << b<<endl;
    cout << dec; // return to dec system
}
int main(){
    int a, b;
    cin >> a >> b;
    reset(&a, &b);
    cout << a <<' '<< b << endl;
}

答案 1 :(得分:1)

不修改变量,在此处使用std::hex后更改basefield 格式标志

cout << hex << (void *)a << endl;
cout << hex << b << endl;

这就是为什么评论这个“修复”这个“问题”。

您可以取消注释此调用,但修改reset()函数,以便恢复原始流状态:

void reset(int *a, int *b)
{
    int sum = *a + *b;
    *a = (sum / 2.0 - sum / 2) >= 0.5 ? sum / 2 + 1 : sum / 2;
    *b = *a;

    cout.setf(std::ios::hex); //Print as hexadecimal numbers

    cout << (void *)a << endl;
    cout << b << endl;

    cout.setf(std::ios::dec); //Restore to decimal
}

我修改了您的重置只设置hex一次,而不是每次打印时都<< hex(尽管没有必要,因为,正如您所注意到的,流被永久修改 - 这就是为什么我更喜欢显式函数调用)。

进一步阅读:std::ios_base::setf