如何打印双指针数组
Posted
技术标签:
【中文标题】如何打印双指针数组【英文标题】:How to print double pointer array 【发布时间】:2020-09-30 11:41:36 【问题描述】:我有两个要打印的双指针数组
但不知何故我无法做到..
double *noise_feature = new double[5];
double *basic_feature = new double[39];
noise_feature_extraction(sig, len, noise_feature);
basic_feature_extraction(sig, len, basic_feature);
cout << "\n";
printf("Noice features are");
for (auto i = noise_feature.begin(); i != noise_feature.end(); ++i)
cout << *i << " ";
cout << "\n";
printf("Basic features are");
for (auto i = basic_feature.begin(); i != basic_feature.end(); ++i)
cout << *i << " ";
cout << "\n";
这会产生这样的错误
Pan_Tompkins.cpp:992:29: error: member reference base type 'double *' is not a structure or union
for (auto i = noise_feature.begin(); i != noise_feature.end(); ++i)
~~~~~~~~~~~~~^~~~~~
Pan_Tompkins.cpp:992:57: error: member reference base type 'double *' is not a structure or union
for (auto i = noise_feature.begin(); i != noise_feature.end(); ++i)
我试过这样打印
printf("%g",noise_feature);
printf("%g",basic_feature);
这不会出错,但也不会打印任何内容。
如何打印这两个双精度数组以查看它们的值?
【问题讨论】:
您应该使用std::vector<double>
而不是分配双精度数组。
【参考方案1】:
您在堆上请求一个原始数组并丢弃它有多少元素的信息。回想一下
double *noise_feature = new double[5];
只声明一个指向double
的指针。您知道它是长度为 5 的连续数组这一事实可以以不同的方式使用。要么你在你的代码中保留那个神奇的数字文字;
for (auto value = noise_feature; value != noise_feature + 5; ++value)
// not maintainable, but works: ^^^^^^^^^^^^^^^^^
cout << *value << " ";
或者你在堆栈上使用一个原始数组。在这里,长度被烘焙到类型中,因此不会丢失。例如,您可以使用基于范围的 for 循环对其进行迭代。
double noise_features[5];
// ...
for (double value : noise_features)
std::cout << value << ' ';
但是,如果序列的大小仅在运行时已知,则首选解决方案是使用 std::vector
,如果是固定长度序列,则使用 std::array
。
【讨论】:
也许还值得一提的是,数组可以使用std::begin(noise_feature)
和std::end(noise_features)
(这基本上是基于范围的循环在后台所做的)
基本上不是,但确实如此!【参考方案2】:
你声明了两个指针
double *noise_feature = new double[5];
double *basic_feature = new double[39];
指针是没有成员函数begin
和end
的标量对象。
所以你必须使用幻数5
和39
来输出指针指向的分配数组。
例如
cout << "\n";
printf("Noice features are");
for ( size_t i = 0; i < 5; ++i )
cout << noise_feature[i] << " ";
cout << "\n";
printf("Basic features are");
for ( size_t i = 0; i < 39; ++i )
cout << basic_feature[i] << " ";
cout << "\n";
同样可以使用指针来完成,例如
cout << "\n";
printf("Noice features are");
for ( auto p = noise_feature; p != noise_feature + 5; ++p )
cout << *p << " ";
cout << "\n";
printf("Basic features are");
for ( auto p = basic_feature; p != basic_feature + 39; ++p )
cout << *p << " ";
cout << "\n";
请注意,您可以使用标准容器 std::vector
代替“手动”动态分配数组,例如
#include <vector>
//...
std::vector<double> noise_feature( 5 );
//...
cout << "\n";
printf("Noice features are");
for ( const auto &item : noise_feature )
cout << item << " ";
cout << "\n";
//...
【讨论】:
【参考方案3】:用array_name[element_count]
之类的语句定义的数组不是任何类的对象!
数组实际上是指向连续内存的指针。因此,它们没有任何方法和成员函数。所以你的代码将无法编译。所以不要这样:
for (auto i = noise_feature.begin(); i != noise_feature.end(); ++i)
使用这个:
for (auto i = noise_feature; i != noise_feature + 5; ++i)
或者这个:
for (auto i = std::begin(noise_feature); i != std::end(noise_feature); ++i)
或者您可以将其存储在 std::vector<double>
对象中。另外,当 C++ 提供std::cout
时,为什么你使用printf
?
【讨论】:
“用像array_name[element_count]这样的语句定义的数组不是对象!数组实际上是指向连续内存的指针”这些语句是完全错误的。 @VladfromMoscow 为什么?是的,它们是对象,但不是类的对象。以上是关于如何打印双指针数组的主要内容,如果未能解决你的问题,请参考以下文章