是否有一种方法来打印通常分配给指针数组的整数?



我正在创建一个涉及指针和数组的程序,我偶然发现了一个问题。基本上,我创建了三个整数,它们将从用户的输入中获取其值,然后按照顺序在数组中声明它们,以便在一个循环中更改它们的所有值。

然后我声明了一个指针,它在循环中使用数组来实现这一点。

期望循环中的指针数组按正常顺序打印数据,而不是反向打印。

请注意,我是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;

pntrint**型,salaryint*[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个变量