【发布时间】:2021-10-19 11:07:30
【问题描述】:
我正在创建一个涉及指针和数组的程序,但我偶然发现了一个问题。 基本上,我创建了三个整数,它们将从用户的输入中获取其值,然后将它们全部声明在一个数组中,以便在一个循环中更改它们的所有值。
然后我声明了一个指针,它使用循环内的数组来做到这一点。
期望循环中的指针数组以正常顺序打印出数据,而不是向后打印。
请注意,我是 C++ 编程的初学者,并且仍在学习指针。
我已尝试更改索引号
pntr = &salary[3];
但是 3 是唯一一个打印出循环中每个输入的值。 0 不起作用,同样适用于 1、2、4 等等。
我希望新输出具有相同的语法(salary1、salary2、salary3),而不是反转它(salary3、salary2、salary1)以打印输入的值。
代码如下:
#include <iostream>
using namespace std;
int main() {
int salary1, salary2, salary3;
cout << "Enter salary for John: ";
cin >> salary1;
cout << "Enter salary for Mark: ";
cin >> salary2;
cout << "Enter salary for Nathan: ";
cin >> salary3;
cout << "Name \t Age \t Position \t Salary" << endl;
cout << "John \t 16 \t Engineer \t " << salary1 << endl;
cout << "Mark \t 16 \t Scouter \t " << salary2 << endl;
cout << "Nathan \t 17 \t Manager \t " << salary3 << endl;
int salary[3] = {salary1, salary2, salary3};
int *pntr;
pntr = &salary[3];
for(int x = 0; x < 3; x++) {
cout << "Enter new salary: " << endl;
cin >> *(pntr + x);
cout << "Salary 1:" << salary1 << endl;
cout << "Salary 2:" << salary2 << endl;
cout << "Salary 3:" << salary3 << endl;
}
cout << "Name \t Age \t Position \t Salary" << endl;
cout << "John \t 16 \t Engineer \t " << salary1 << endl;
cout << "Mark \t 16 \t Scouter \t " << salary2 << endl;
cout << "Nathan \t 17 \t Manager \t " << salary3 << endl;
return 0;
}
【问题讨论】:
-
我认为您对“pntr”的初始化会导致它指向“salary”末尾的 1,因此“pntr+x”指向您要访问的数据。
-
你为什么要
cin >> *(pntr + x);?你想在打印出用户刚刚输入的以前的工资之前覆盖工资吗? -
马克是对的,当您执行
pntr+x并取消引用它时,您正在访问超出工资数组边界的内存,因为您已经将 pntr 设置为指向工资数组之后的一个。 -
如前所述,
pntr = &salary[3];立即将pntr置于数组范围之外。pntr = salary;就足够了,但我根本不会费心使用指针。 -
我试过 pntr = 薪水;但它不会注册用户的输入和输出新值。