我正在创建一个涉及指针和数组的程序,我偶然发现了一个问题。基本上,我创建了三个整数,它们将从用户的输入中获取其值,然后按照顺序在数组中声明它们,以便在一个循环中更改它们的所有值。
然后我声明了一个指针,它在循环中使用数组来实现这一点。
期望循环中的指针数组按正常顺序打印数据,而不是反向打印。
请注意,我是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;
}
如果要更改salary1
,salary2
,salary3
的值,则应将salary[3]
声明为int*
,而不是int
!
int salary[3] = { salary1, salary2, salary3 };
int* salary[3] = { &salary1, &salary2, &salary3 };
那么你的指针也应该是双指针,如:
int** pntr = salary;
最后,你应该取消对(pntr + x)
的两次引用,因为它现在是双指针:
cin >> **(pntr + x);
整个代码:
#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 = salary;
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;
}
你可能对
这行还有疑问int** pntr = salary;
pntr
为int**
型,salary
为int*[3]
型,
数组的地址表示数组第一个元素的地址,
和
是一样的int** pntr = &salary[0];
你可以很容易地找到相同的
只执行上面两个不同初始化的完整代码
如果你没有清晰的理解,你可以写int** pntr = &salary[3];
&salary[3]
表示salary[3]
的地址,
andsalary[3]
只是一个int*
值,而不是一个数组类型
表示数组salary
的第三个元素的地址,记住它
仅在初始化时index表示数组的大小,初始化后index表示值
你眼前的问题是双重的。初始化指针并立即将其指向数组外。如果您有一个容量为3的数组,则索引如下:
--- --- ---
| 0 | 1 | 2 |
--- --- ---
索引3不在你的数组中,所以你的指针指向它的外部。将初始化更改为:int* pntr = salary;
.
然后,您的另一个问题是,当您将新的薪水放入数组时,您永远不会再次访问该数组。相反,您将再次查看从未修改过的三个int
变量。这个练习也根本不需要这些变量。
这是你的代码的精简版本,修复了当前的问题。
#include <iostream>
int main() {
int salary1, salary2, salary3;
std::cout << "Enter salary for John: ";
std::cin >> salary1;
std::cout << "Enter salary for Mark: ";
std::cin >> salary2;
std::cout << "Enter salary for Nathan: ";
std::cin >> salary3;
std::cout << "Name t Age t Position t Salary" << 'n';
std::cout << "John t 16 t Engineer t " << salary1 << 'n';
std::cout << "Mark t 16 t Scouter t " << salary2 << 'n';
std::cout << "Nathan t 17 t Manager t " << salary3 << 'n';
int salary[3] = {salary1, salary2, salary3};
int *pntr = salary; // CHANGED
// CHANGE: Print the array
for (auto i : salary) {
std::cout << i << 'n';
}
for (int x = 0; x < 3; x++) {
std::cout << "Enter new salary: ";
std::cin >> *(pntr + x);
std::cout << "Salary " << x + 1 << ": " << salary[x]
<< 'n'; // CHANGED: Access the array
}
// CHANGE: Print the array
for (auto i : salary) {
std::cout << i << 'n';
}
return 0;
}
似乎奇怪的是,你会有一个数组的工资。下面是您的程序的一个新版本,它利用了一些您可能还没有见过的c++概念,但我希望您能够体会到它使您的代码变得多么简单。请注意,我不会把这段代码称为最佳实践,但我认为它的目的是展示一些新的原则。
最大的设计变化是,我们有了一组人,而不是只有工资的数组,如果需要,我们可以改变他们的工资。
#include <iomanip>
#include <iostream>
#include <vector>
struct Person {
std::string name;
int age;
std::string title;
int salary;
};
void print_table(const std::vector<Person>& emp) {
std::size_t maxNameLength = 0;
std::size_t maxTitleLength = 0;
for (auto i : emp) {
if (i.name.length() > maxNameLength) maxNameLength = i.name.length();
if (i.title.length() > maxTitleLength) maxTitleLength = i.title.length();
}
std::cout << std::setw(maxNameLength + 1) << "Name"
<< "|Age|" << std::setw(maxTitleLength + 1) << "Title"
<< "|Salaryn";
for (auto i : emp) {
std::cout << std::setw(maxNameLength + 1) << i.name << "|" << std::setw(3)
<< i.age << "|" << std::setw(maxTitleLength + 1) << i.title << "|"
<< std::setw(6) << i.salary << 'n';
}
}
int main() {
std::vector<Person> employees{{"John", 16, "Engineer", 0},
{"Mark", 16, "Scouter", 0},
{"Nathan", 17, "Manager", 0}};
for (int x = 0; x < 3; x++) {
std::cout << "Enter new salary for " << employees[x].name << ": ";
std::cin >> employees[x].salary;
}
print_table(employees);
return 0;
}
输出:
Enter new salary for John: 34
Enter new salary for Mark: 45
Enter new salary for Nathan: 56
Name|Age| Title|Salary
John| 16| Engineer| 34
Mark| 16| Scouter| 45
Nathan| 17| Manager| 56
#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};
for (int x = 0; x < 3; x++) {
cout << "Enter new salary: " << endl;
cin >> * (salary + x);
cout << "Salary " << x << ": " << * (salary + x) << endl;
}
cout << "Name t Age t Position t Salary" << endl;
cout << "John t 16 t Engineer t " << salary[0] << endl;
cout << "Mark t 16 t Scouter t " << salary[1] << endl;
cout << "Nathan t 17 t Manager t " << salary[2] << endl;
}
也许你最后想要这样的东西?
注意事项:
- 数组衰减为指针,因此您不需要额外的指针
- salary1, salary2, salary3不会像您所期望的那样被覆盖,因为它们从未被触及。当您执行
cin >> *(salary+ x);
时,工资数组中的内存将被覆盖。 - 所以最后你想打印的是数组中的内容而不是salary1 2 3个变量