C++ 如何声明指向C++;11 std::阵列?

C++ 如何声明指向C++;11 std::阵列?,c++,pointers,c++11,stdarray,C++,Pointers,C++11,Stdarray,根据变量,我需要选择SEEDPOSITION32或SEEDPOSITION16数组以供进一步使用。我原以为指针会允许这样做,但我无法让它工作。如何声明指向C++11 std::数组的指针?我试过下面的方法 array<int>* ArrayPointer; //array<typedef T, size_t Size>* ArrayPointer; array<int,32> SeedPositions32 = {0,127,95,32,64,96,31,63

根据变量,我需要选择SEEDPOSITION32或SEEDPOSITION16数组以供进一步使用。我原以为指针会允许这样做,但我无法让它工作。如何声明指向C++11 std::数组的指针?我试过下面的方法

array<int>* ArrayPointer;
//array<typedef T, size_t Size>* ArrayPointer;
array<int,32> SeedPositions32 = {0,127,95,32,64,96,31,63,16,112,79,48,15,111,80,
                               47,41,72,8,119,23,104,55,87,71,39,24,7,56,88,103,120};
array<int,16> SeedPositions16 = {...}
array*阵列指针;
//数组*数组指针;
数组种子位置32={0127,95,32,64,96,31,63,16112,79,48,15111,80,
47,41,72,8,119,23,104,55,87,71,39,24,7,56,88,103,120};
数组SeedPositions16={…}

std::array
有一个用于大小的模板参数。两个不同大小的
std::array
模板实例化是不同的类型。因此,您不能有一个指针可以指向不同大小的数组(除非
void*
trickery打开了自己的蠕虫罐)

您可以为客户机代码使用模板,或者改用
std::vector

例如:

template <std::size_t N>
void do_stuff_with_array(std::array<int, N> the_array)
{
  // do stuff with the_array.
}

do_stuff_with_array(SeedPositions32);
do_stuff_with_array(SeedPositions16);

但是在这里,您丢失了大小信息。您必须独立跟踪它。

您可以这样做:

int * myArray = use32 ? &SeedPositions32[0] : &SeedPositions16[0];

您只需使用
std::array::data()
成员函数以原始的类C数组指针的形式访问
std::array
的内容:

int* arrayPointer = useSeedPositions32 ? SeedPositions32.data() : SeedPositions16.data();

在他的回答中,胡安科潘扎很好地解释了为什么你想要的东西不起作用

问题是你为什么要这么做?无法使用(指向)
std::array
的指针代替
std::array

std::array
的要点是在编译时跟踪元素的数量(同时避免为固定大小的小数组分配内存)。如果您希望在运行时管理元素的数量,则不应该使用
std::array
,而应该使用
std::vector

获取指向底层数据的指针(使用其他答案中建议的
std::array::data()
)并自己跟踪元素数量的替代方法有些危险,不太推荐。问题是,您必须确保指针永远不会悬空

最后,我找不到任何可能的用例。要使用指针,必须同时声明
数组
数组
对象,但只能使用其中一个。
如果不需要全部32个元素,为什么不直接声明一个
数组
并只使用它的前16个元素?

可以使用std::array::data来获取数据指针。返回的指针将仅使用std::数组的第一个模板参数键入。看起来这就是你想要的。这个问题是这样一个例子:你有一个你想要使用的解决方案,并寻求建议使这个特定的解决方案有效。但你从来没有告诉我们你到底想解决什么问题。也许还有其他(甚至更好)的解决方案。@JoachimPileborg-我正在尝试创建一个网球比赛模拟器,其中比赛结果是随机的(某种程度上)。大满贯赛有128名选手,其中32名是种子选手。目前我正试图把种子放在适当的位置。我有随机生成的实力的球员在一个升序排序数组。理想情况下,我会有一个算法将每个玩家放置在绘图中的正确位置,但我还没有找到一个算法,所以我手动键入位置作为数组索引,然后打算选择合适的位置。可以获得指向底层“裸”数组的指针?@Mhd.Tahawi std::array::data或std::array[0].@Mhd.Tahawi您可以获得指向底层数据的指针,但会丢失类型信息(特别是大小)。注意:常用的类是
ArrayRef
array\u view
,其中包含指向数组和数组大小的指针,并重载所有有用的运算符(显示容器接口)。不幸的是,它还不是标准的,但很容易编码。它的主要问题是将它的生存期与底层存储的生存期相协调……遗憾的是,
std
中没有ArrayRef/array\u视图。Rust还为不同长度的静态/堆栈分配数组提供了不同的类型(
[T;N]
),但至少它们都强制执行
&[T]
,编译时长度自动转换为运行时长度。数组的前16个元素与存储在数组中的元素不同。由于没有一个算法来确定他们的位置,我需要根据比赛中球员的数量选择一组位置。在决定使用哪种解决方案之前,我将再次尝试算法。谢谢你的帮助。
int* arrayPointer = useSeedPositions32 ? SeedPositions32.data() : SeedPositions16.data();