我正在尝试在函数中传递一个数组,然后将其打印出数组中的值。
这就是我所拥有的
numbers.cpp
#include <iostream>
#include <string>
#include "numbers.h"
int * numbers::printNumbers() {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
arrayOne[j] =i;
}
}
return arrayOne;
}
numbers.h
#ifndef try_numbers_h
#define try_numbers_h
#include <iostream>
#include <string>
class numbers {
public:
int * printNumbers();
private:
int arrayOne[4];
};
#endif
的main.cpp
#include <iostream>
#include <string>
#include "numbers.h"
int main () {
numbers printNum;
int * p;
p = printNum.printNumbers();
}
上面显示的代码,成功运行
但我的输出正在返回一些奇怪的内存地址
输出
0x7fff5fbff8e0
右边应输出
期待输出
0
1
2
3
答案 0 :(得分:1)
您的代码是正确的。
它正在打印的内存地址是类变量arrayOne
的开头的地址。你之所以看到这个而不是:
0
1
2
3
这是代码:
numbers printNum;
int * p;
p = printNum.printNumbers();
仅被分配了数组arrayOne
的地址,而不是其内容的值。
这给我们带来了另一个问题:您没有看到任何输出,因为您不打印出每个数组索引处的数据(如代码所示)。
为此,您应该将指针迭代到数组 arrayOne
并输出它们,以便查看/验证您的预期结果。
但是,由于您当前的方法违反了最少惊喜的原则(因为您的方法的名称是printNumbers
(但不打印数字并返回数组的地址),那么它是一个好的想要重构代码,以便函数printNumbers
打印数字(并且不返回数组的地址)。
并且,鉴于数组确实具有内置的维度感(即他们不了解自己的维度,因此其他人建议使用std::vector
代替它会更好,因为这样更安全,自我清理后,与具有类似性能的C-Style阵列相比,具有更多的功能/优势。
答案 1 :(得分:0)
您可以将arrayOne
公开,printNumbers()
无效。然后在main.cpp中执行以下操作:1)执行函数printNum.printNumbers()
2)分配给p
您的printNum.arrayOne
。
希望这有帮助!