C语言 初始化数组的数组-故障

kiayqfof  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(89)

好的,我知道在C++中,一个二维数组可以这样初始化:

int theArray[5][3] = { 
    {1,2,3},
    {4,5,6},
    {7,8,9},
    {10,11,12},
    {13,14,15} 
};

现在,如果我想使用预先存在的数组作为theArray的元素,该怎么办?

例如

// A, B, C, D,... have already been declared as :
// `const U64 A[] = { 1,2,3,4 };` etc...

const U64 multiDimArray[12][64] = { 
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

这一个,抛出一个错误

cannot initialize an array element of type 'const U64' 
(aka 'const unsigned long long') with an lvalue of type 'const U64 [64]'

我明白你的意思,但希望你也能理解我。
是否有一个变通方法,以便我可以轻松地实现同样的事情?(有什么建议吗?也许是使用Boost的东西?)欢迎)

ct2axkht

ct2axkht1#

如果你使用C++11,array的初始化列表是灵活的:

std::array<std::array<U64, 64>, 12> multiDimArray = {
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

将工作正常,假设A..Lstd::array<64, U64>
这个数组对C风格的数组来说确实没有开销。Click here for official reference.
“数组<T,N>对于一定数量的元素的大小和效率等同于对应的C风格数组T[N]的大小和效率。”(来自参考文献)
我说的是“灵活”,因为你可以像这样使用混合初始化器列表:

std::array<int, 3> first_row = {1,2,3};
std::array<std::array<int, 3>, 2> a={
  first_row,
  {2, 2, 2}
};

你可以把它作为一个固定大小的数组,使用相同的操作:

a[1][2]=2; a[0][1]=1; a[0][2]=3;
qyyhg6bp

qyyhg6bp2#

我可以理解为什么这很有用,然而,在C中,只使用数组的变量名将返回数组在内存中的地址。编译器不知道在编译期间A中实际存储了什么,所以这不会起作用。
作为替代方案,你可以做的是使用memcpy并将元素复制到数组中(但这样就不会是const),或者你可以使用#define A { 1, 2, 3, 4 },然后可能做类似的事情:

#define A_val { 1, 2, 3, 4 }
#define B_val { 5, 6, 7, 8 }
const U64 multiDimArray[12][64] = {
    A_val,
    B_val,
    // and so on and so forth
}
const U64 A[4] = A_val; // if you need this
const U64 B[4] = B_val; // you can do it like this
nbysray5

nbysray53#

你可以利用一个二维数组实际上是一个一维指针数组的事实来为你的优势。下面的初始化应该对你有用。

const U64 *multiDimArray[12] = { 
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

相关问题