如何阻止我的数组打印地址
How do I stop my array from printing address?
我有一个标题,cpp和主类。
//Arr.h
class Arr
{
public:
void setArr();
void printArr();
private:
int x[5];
};
//Arr.cpp
#include "Arr.h"
#include <iostream>
using namespace std;
void Arr::setArr()
{
int x[5] = { 2, 3, 5, 7, 11 };
}
void Arr::printArr()
{
for (int i = 0; i < 5; i++)
{
cout << x[i] << "n";
}
}
//main.cpp
int main()
{
Arr a;
a.setArr();
a.printArr();
}
但是,当我运行代码时,a.printArr() 打印出数组地址,而不是数组中包含的值。有没有办法解决这个问题?
您的代码将打印的不是地址,而是通过默认初始化生成的一些不确定值。初始化成员数组而不是要丢弃的本地数组。
void Arr::setArr()
{
x[0] = 2;
x[1] = 3;
x[2] = 5;
x[3] = 7;
x[4] = 11;
}
你的问题在这里:
void Arr::setArr()
{
int x[5] = { 2, 3, 5, 7, 11 };
}
声明int x[5]
定义了一个由 5 个元素组成的新数组,这些元素将在退出该函数时销毁;名称x
隐藏了数据成员Arr::x
。
您可以做到这一点的一种方法是:
void Arr::setArr()
{
/*static*/ auto arr = { 2, 3, 5, 7, 11 };
std::copy(arr.begin(), arr.end(), x);
}
完整代码:
#include <iostream>
#include <algorithm>
class Arr
{
public:
void setArr();
void printArr();
private:
int x[5];
};
using namespace std;
void Arr::setArr()
{
/*static*/ auto arr = { 2, 3, 5, 7, 11 };
std::copy(arr.begin(), arr.end(), x);
}
void Arr::printArr()
{
for (int i = 0; i < 5; i++)
{
cout << x[i] << "n";
}
}
//main.cpp
int main()
{
Arr a;
a.setArr();
a.printArr();
}
您的代码未打印数组地址。 也许您看到了一些意外的数字并认为它是一个地址,但实际上这是由输出未初始化的变量引起的未定义行为。
您的代码int x[5] = ....
失败,因为这声明了一个新的局部变量x
,它不会修改类成员x
。
也许你试过:
x = { 2, 3, 5, 7, 11 };
并出现编译错误。这是因为可能无法分配 C 样式数组。这个烦人的规则是C++过去的遗留物。为了避免此问题和许多其他问题,您可以尝试避免使用 C 样式数组。 在这种情况下,请使用C++数组:
private:
std::array<int, 5> x;
然后,建议的分配将起作用。
正如WhiZTiM已经指出的那样,你的问题出在类中的setArr函数上。这样做的原因是,在C++中,您无法以"正常方式"为数组赋值,即使用 x = {blah, blah, blah};
(除非您使用 std::array<int, ARRAYSIZE>
)。在 setArr 中,您将创建另一个名为 x
的数组,然后在该数组超出范围后将其删除,并且在printArr
中,您正在打印一个尚未包含任何值的数组。
数组中的每个值都必须在 C 样式的数组中单独设置(如 MikeCAT 的答案所示)。
一种解决方案是创建一个具有所需值的临时数组,并通过 for 循环将值分配给类数组,即:
void Arr::setArr() {
const int ARRAYSIZE = 5;
int tmp[ARRAYSIZE] = {2, 3, 5, 7, 11};
for (int i = 0; i < ARRAYSIZE; ++i) {
x[i] = tmp[i];
}
}
正如 M.M 还指出的那样,可以简单地将 Arr 中的私有变量中的int x[5]
更改为 std::array<int, 5> x
然后在 setArr 中只需语句: x = {2, 3, 5, 7, 11};
在我看来这是更好的选择,更容易阅读,但知道如何使用 C 数组 也很好
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 打印字符数组地址的正确方法
- cout 打印内存地址而不是值
- 如何访问头文件中类的组件并打印它们的地址?
- 为什么当我尝试打印地图内容时,我得到的是地址而不是 C++ 中的值?
- 为什么变量的打印地址在每次执行时都会打印随机值,即使它是 C 中的逻辑地址?
- 为什么这是打印内存地址而不是值
- 将指针传递给函数 - 为什么我无法打印地址?
- 如何使用Qt为每个地址打印二进制文件
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 使用指针,打印地址而不是值,为什么?(使用运算符)
- 为什么此代码打印字符串而不是打印地址
- 如何阻止我的数组打印地址
- 为什么我的函数打印地址而不是数组的内容
- 如何在c++中用大写字母打印地址(十六进制值)
- 为什么将字符指针流式传输到 cout 不打印地址
- 为什么插入运算符打印地址而不是字符串
- 临时打印地址
- 运算符打印地址<<重载
- 输出打印地址而不是3D数组指针中的值