C - 如何将静态数组放入数组中

C++ - How do I put a static array inside my array?

本文关键字:数组 静态      更新时间:2023-10-16

我为总的菜单问题表示歉意,但我只是找不到答案。我在这里搜索,在这里搜索,搜索了C 数组文档和一些C 数组教程。
问题很简单。为什么

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
      short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
      ... //do stuff.  Imagine a loop here, and BIG array - I'm just simplifying it for StackOverflow
      pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};
    return 0;
}

导致错误?

1>arraytest.cpp(11): error C2059: syntax error : '{'

如何将静态数组放入阵列中?我意识到我可以单独设置每个项目,但是必须有更好的方法。

c 中的内置数组存在问题,而不可分配确实会使它们变得不灵活。我坚持使用std::array,一个C 11容器,该容器模拟了更好的数组风格,这允许与您想要的内容有些相似的语法:

std::array<int, 3> arr{{1, 2, 3}};
std::array<int, 3>{{4, 5, 6}}.swap(arr);
//now arr is {4, 5, 6}

这是一个完整的样本。诀窍是在新构造的数组上使用初始化列表,然后将其与您的初始列表交换。我相信下一个C 更新也将消除对双括号的需求,这使其与熟悉的语法更加紧密。

初始化列表可用于初始化:)
就像您声明变量时:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}}; // this is ok

您必须删除此信息:

pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

并手动分配新值(即pixelarray[x][y] =或使用memcpy(pixelarray, <some other array>, sizeof(pixelarray))

如果您不想手动分配每个元素,则可以执行此操作:

short pixelarray2[3][3] = {{1,0,-1},{1,0,-1},{1,0,-1}};
memcpy(pixelarray, pixelarray2, sizeof(pixelarray));

@nick指出:初始化器列表不用于分配。

阵列不可分配,因此简短的答案是您无法完全做您的要求。对于大多数目的而言,做足够类似的事情的最直接方法可能是一个2D阵列类,在我在上一个答案中发布的一个顺序,该类是std::vector周围的包装器。

如果您坚持使用C风格数组,则可能是使用指针:

int main() { 
    typedef short array[3];
    array pixelarray0[3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
    array pixelarray1[3] = {{1,0,-1},{1,0,-1},{1,0,-1}};
    array *pixelarray = pixelarray0;
    // when needed:
    pixelarray = pixelarray1;
}

从直接C上下文中获取此问题,您可以具有不同的常数数组,只需用memcpy复制它们:

typedef short TArray[3][3];
const TArray a1 = {{1,1,1},{0,0,0},{-1,-1,-1}};
const TArray a2 = {{1,0,-1},{1,0,-1},{1,0,-1}};
// ...    
TArray a;
memcpy( a, a2, sizeof(TArray));

,也可以利用C99结构复制,但是我认为这是一个危险的黑客,因为结构可能比数组大,或者具有不同的对齐。

typedef struct {
    TArray arr;
} TDummyArray;
// ...
TArray a;
*(TDummyArray*)a = *(TDummyArray*)a2;

一旦您声明了您的数组,就无法使用分配操作员重新分配数组的整个内容。

因此,在此之后更改内容或数组:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};

您需要循环遍历数组并手动更改每个值,或者像std :: memcpy之类的东西以复制新值。

但是,您真的不应该首先使用数组,而是使用一些从std Collections库中使用的阵列,例如std ::数组或std :: vector。仅在您有真正的好理由时使用数组,为什么无法使用集合。