如何打印双指针数组

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&lt;double&gt; 而不是分配双精度数组。 【参考方案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];

指针是没有成员函数beginend 的标量对象。

所以你必须使用幻数539 来输出指针指向的分配数组。

例如

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&lt;double&gt; 对象中。另外,当 C++ 提供std::cout 时,为什么你使用printf

【讨论】:

“用像array_name[element_count]这样的语句定义的数组不是对象!数组实际上是指向连续内存的指针”这些语句是完全错误的。 @VladfromMoscow 为什么?是的,它们是对象,但不是类的对象。

以上是关于如何打印双指针数组的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-双指针遍历

如何根据它们指向的值对双指针数组进行排序?

如何从双指针数组创建 Eigen::VectorXd

#运算符不同的指针类型数组和指针指针运算堆栈静态区只读区下标VS指针

遇到双指针的问题

如何调用具有双指针作为参数的内核?