通过地址
这一周改变指针的值,我们任务是创建一个程序,其中:通过地址
- 程序显示阵列的地址和值
- 用户输入他想改变 相应的地址
- 用户输入该地址
我能弄清楚如何指针作品新的价值,但它显示的另一号码,而不是输入值。
下面的代码:
int j =1, var, nx;
int array[4] = {3618, 6555, 5012, 1869};
int* pa; //pointer
char choice;
int remember = 0;
pa = array;
cout << endl;
cout << "\t------------------------" << endl;
cout << "\t\t Values" << endl;
cout << "\t------------------------" << endl;
for(int i = 0; i<4; i++){
cout << "\tarray" << j;
cout << " = " << std::dec << *(pa + i);
cout << " (" << pa + i << ")" << endl;
j++;
}
cout << "\t------------------------" << endl << endl;
cout << "\tPlease enter an address: ";
cin >> hex >>var;
cout << endl;
cout <<"\tYou entered: " << hex << var << endl;
cout << "\tPlease enter a new value: ";
cin >> nx;
pa = (int*)var;
cout << endl;
*pa = nx;
pa = array;
j=1;
cout << endl;
cout << "\t------------------------" << endl;
cout << "\t\t New Values" << endl;
cout << "\t------------------------" << endl;
for(int i = 0; i<4; i++){
cout << "\tarray" << j;
cout << " = " << std::dec << *(pa+i);
cout << " (" << &array[i] << ")" << endl;
j++;
}
cout << "\t------------------------" << endl << endl;
问题是cin >> nx;
正在读取值为十六进制。我很确定发生这种情况,因为之前在程序中使用的cin
以十六进制形式读取值:cin >> hex >>var;
。我观察到与测试时添加到程序中的cout
声明相同的情况。
如果更改为cin >> std::dec >> nx;
,程序的行为是正确的。
例如,使用测试运行:在十六进制353转换为十进制时是851
一个有用的提示为未来:你不需要j
变量:在for
循环里面,你可以只使用i + 1
。
一个很好的习惯进入是用描述性的文字为你的变量。它使调试变得更容易,更重要的是了解发生了什么。现在
,如果我正确地解释这一点,你要设置pa
等于叫var
新指针,而不是设置pa
等于var
。 Here is a reference page on pointers,滚动到解除引用操作符来查看我在说什么。 (int *)是不必要的。
注意! (int *)被放置为强制pa与变量类型int *兼容。没有它,会显示一个错误“将'int'赋值为'int *'的不兼容类型。 – WilyFreddie
OP看到的是hex
修改器仍然有效。
cin >> hex >>var;
打开hex
。没有什么关闭了。
因此,当OP输入353时,程序将其解释为十六进制数字。 0x353 == 851
解决方案:
还原为十进制输入。
cin >> dec >> nx;
谢谢@GigaRohan!有用! – WilyFreddie