指向 std::vector 的指针,指针声明

Posted

技术标签:

【中文标题】指向 std::vector 的指针,指针声明【英文标题】:Pointer to std::vector, pointer declaration 【发布时间】:2017-12-07 08:19:53 【问题描述】:

将 std::vector 传递给具有我不太了解的特殊签名的函数的这两个指针声明之间有什么区别吗?

libraryFunction (int numSamples, double* const* arrayOfChannels)  
  //things


std::vector<double> theVectorA = 11, 22, 33, 44;
double * p_VecA[1];
p_VecA[0] = theVectorA.data();
libraryFunction(theVectorA.size(), p_VecA);

std::vector<double> theVectorB = 55, 66, 77;
double * p_VecB = theVectorB.data();
libraryFunction(theVectorB.size(), p_VecB);

p_VecA 和 p_VecB 有什么区别?

你能解释一下函数签名吗?最后一段没看懂。

【问题讨论】:

p_VecA 是双倍** 而 p_VecB 是双倍* 您的意思是除了p_VecA 是一个数组 指针,而p_VecB 不是吗? 关于指针,一般推荐使用螺旋规则来读取,所以arrayOfChannels是一个指向双精度的const指针。 所以正确的方法是使用 p_VecA 选项,因为函数签名需要指针数组。对吗? 【参考方案1】:

double * p_VecA[1]; 创建一个包含 1 个指针元素的数组,它指向一个 double(在这种情况下,theVectorA 中的第一个 double)。因此p_VecA 是一个指向双精度的指针数组,在这种情况下,如果您使用没有索引的名称,它会衰减为指向其第一个元素的指针(将其视为double**)并且p_VecA[0] 的类型为double* (就像p_VecB 一样)。

double * p_VecB 创建一个指向 double 的指针(在这种情况下,theVectorB 中的第一个 double)。

更新:

也许这可以帮助你理解libraryFunction()的签名:

What is the difference between const int*, const int * const, and int const *?

就像 Jack 写的:arrayOfChannels 是一个指向 double 的 const 指针的指针

【讨论】:

谢谢!所以在这种情况下正确的方法是第一个选项p_VecA,另一个不正确,对吧? Therefore p_VecA is of type double** 不,不是。它是一个数组;不是指针。 谢谢你是对的。我在回答中澄清了这一点。【参考方案2】:

p_vecA 是一个大小为 1 的指针数组

double * p_VecA[1];

p_VecB 是指针

double * p_VecB = theVectorB.data();

可以写成

double * p_VecB;
p_VecB = theVectorB.data();

【讨论】:

这不是家庭作业。我必须使用该函数,但我不理解函数签名:libraryFunction(int numSamples, double * const * arrayOfChannels)。我写了第一个代码(p_VecA 两年前,我不记得我为什么这样做了,我在想 p_VecA 和 p_VecB 是一样的,我的错 哈哈大家搞错了。祝你工作顺利

以上是关于指向 std::vector 的指针,指针声明的主要内容,如果未能解决你的问题,请参考以下文章

访问指向对象指针向量的指针的第一个元素?

C++ 中的指针错误

指针转引用

指向std :: vector和std :: list元素的指针

指向 std::vector 和 std::list 元素的指针

声明变量以保存字符串列表时的内存分配