C++ 如何从指向数组的指针获取对该数组的引用

C++ 如何从指向数组的指针获取对该数组的引用,c++,arrays,pointers,reference,C++,Arrays,Pointers,Reference,简单的问题。我有一个指向数组的指针 vector<int> myVector = { 22, 18, 12, -4, 58, 7, 31, 42 }; int* myPtr = myVector.data(); 另外,我需要将它作为数组传递,这是一个先决条件,所以不要只谈论传递向量,因为我希望我可以 编辑: template void sort_quick(T&arr)[N]); 这应该是合法的语法 编辑2: template<typename T> void sor

简单的问题。我有一个指向数组的指针

vector<int> myVector = { 22, 18, 12, -4, 58, 7, 31, 42 };
int* myPtr = myVector.data();
另外,我需要将它作为数组传递,这是一个先决条件,所以不要只谈论传递向量,因为我希望我可以

编辑:

template void sort_quick(T&arr)[N]);
这应该是合法的语法

编辑2:

template<typename T> void sort_quick(T* arr, size_t length);
template void sort\u quick(T*arr,size\u T length);

当需要处理数组而不是向量时,我相信这将是最好的版本。

如果不使用C++11,可以这样做:

sort_quick( &arr[0] );

排序函数的签名采用数组引用;您可能不知道的是,C或C++中没有R值表达式可以产生数组,也就是说,R值可能不是数组类型。您可能还不知道数组作为参数传递给函数时如何衰减到指针,但这可能有点离题

无论如何,您不能执行以下操作:

sort_quick(my_vec.data());

如果您必须将该函数与该签名一起使用(即,它是一个您无法控制的接口),则需要使用以下信息构造一个数组:值集是
[my_vec.data();my_vec.size()]
是有效的。至于为什么不能只使用
std::vector::data()
,如果仔细观察,您会发现它的返回类型是
t*
,指针不会神奇地将衰减反转到数组引用中。

C样式的数组边界必须在编译时已知。您对
sort\u quick
的原始定义是非法的。这是合法的:

template<typename T, int N> void sort_quick(T (&arr)[N]);

不能编译
sort\u quick
的声明。在C++中,不允许引用未知绑定数组作为参数。<代码> MypTr> /Cord>不是指向数组的指针,它是指向<代码> int <代码>的指针,恰好是数组的元素。无法“返回”到它所属的数组。在我看来,这个问题是双面的@布瑞恩说C++不允许数组的未知边界作为参数。请参见编辑。第二个问题仍然存在,是否没有办法将向量数组作为引用传递?这仍然是不可能的,因为向量的大小直到运行时才知道,但模板参数必须在编译时知道。(或者,更确切地说,模板参数必须是常量表达式)。所以,在给定C++数组的指针的情况下,没有任何方法可以将数组作为引用传递给C++吗?您应该将此作为答案发布,以便我标记它。没有对“sort\u quick”进行匹配的函数调用。我认为不能有数组类型的右值是错误的。类成员访问的结果,其中对象表达式是一个右值,名为数组的成员是一个数组类型的右值,不是吗?@Brian确实不能有数组类型的右值。左值到右值的转换需要数组到指针的转换。@bfoster左值表达式可能会生成一个数组。这句话应该改成正确的,否则decl/init表达式将不起作用!我现在就编辑它。@Brian抱歉,我想说的是没有数组类型的prvalues。(您的示例是一个xvalue)。我猜bfoster也指prvalues(在C++11之前称为“rvalues”),而我确实认为使用迭代器的解决方案很优雅,在我看来,实现这一点的方法是,我被要求使用数组参数编写一个快速排序。因此,如果数组在编译时不可用,我最好的做法就是在处理数组时使用指针。@FranciscoAguilera为什么您的函数不能使用
t[]
(或其等价的
t*
)和一个长度参数?人们总是把数组传递给C中的函数(当然,C++中存在更好的替代品,这就是为什么这个要求在最初是愚蠢的)。它可以采用t[]和长度参数,但是这样可以复制一个潜在的大数组。我确实提到T*是我将来解决这个问题的方式。请参阅我的第二次编辑。@FranciscoAguilera接受
T*
,长度不会导致复制。指针指向已经存在的数据。是的,可以复制,但只复制指针:)我的意思是,如果函数采用T[]而不是T*,则复制完整对象。
sort_quick( &arr[0] );
sort_quick(my_vec.data());
template<typename T, int N> void sort_quick(T (&arr)[N]);
template<typename Iterator> void sort_quick(Iterator begin, Iterator end);
sort_quick(myVector.begin(), myVector.end());