搜索

首页  >  问答  >  正文

C++中结构体的 二维数组 初始化方法和顺序是怎样的?

如现有一个结构体
typedef struct
{
uint8_t a;
uint8_t b[10];
uint8_t c[3];
}basic;

而定义一个二维数组
basic array[][5],如何对其初始化?

是这样吗:
basic array[][4]=
{
{1,0,0},
{2,0,0},
{3,0,0,0,1},
{2,2,1,2,2},
{3,1,1,4,2,2,4},
}
如果按这样初始化,
array的array0,array0,...array2...
分别都是什么呢?
array一共有几行呢?
我看到一个源码里面的意思好像是,这样初始化过后,array有5行。。。我觉得不理解。。。也不确定源码有没有错误。有没有人能帮忙解答?

高洛峰高洛峰2807 天前699

全部回复(2)我来回复

  • PHPz

    PHPz2017-04-17 14:28:48

    把那个struct当成一个普通的int[14]理解就好啦,就是二维数组的初始化,你可以像这样打印出来看看。

    #include <iostream>
    
    using namespace std;
    
    typedef struct
    {
        uint8_t a;
        uint8_t b[10];
        uint8_t c[3];
    }basic;
    
    int main()
    {
        basic array[][4]=
        {
            {1,0,0},
            {2,0,0},
            {3,0,0,0,1},
            {2,2,1,2,2},
            {3,1,1,4,2,2,4},
        };
        for (int i = 0; i < 5; ++i)
        {
            cout << (unsigned int)array[i][0].a << endl;
        }
        basic test[][5] =
        {
            {{1,0,0},
            {2,0,0},
            {3,0,0,0,1},
            {2,2,1,2,2},
            {3,1,1,4,2,2,4}}
        };
        for (int i = 0; i < 5; ++i)
        {
            cout << (unsigned int)test[0][i].a << " ";
        }
        cout << endl;
        return 0;
    }
    

    因为uint8_t是unsigned char的typedef,所以才转换成unsigned int输出。。。。
    这里有篇博文介绍了二维数组的初始化http://blog.csdn.net/chenshij...
    这个初始化难于理解的原因我感觉是因为,平时我们二维数组的初始化用一个花括号括起来的时候,通常都是表示了对一行的初始化,而在这个问题里面,结构体的初始化恰好可以用花括号,导致了有一些混乱,不过这里的花括号,还是表示的对整个一行的初始化,而不是对一个的结构体元素的初始化。要对这个二维数组里面的结构体逐次初始化,就要像你那样再加层花扩号。

    回复
    0
  • 怪我咯

    怪我咯2017-04-17 14:28:48

    你把你初始化的每一行一维数组想象成一个元素,再把整个二维数组想象成一个容纳这个元素的一维数组,就明白了。
    二维数组其实就是一个一维数组的数组,你可以看成是一个嵌套了数个具有相同大小数组的数组。每个数组元素就是一个数组,所以你声明的时候,前一个数字可以没有,根据你初始化了多少个数组来决定,但是后一个数字必须有,因为必须确定每一个元素的大小。

    回复
    0
  • 取消回复