Динамическое выделение многомерного массива структуры с использованием C ++ - PullRequest
1 голос
/ 24 сентября 2019

Для школьного проекта я пытаюсь динамически объявить массив структур со строками и столбцами в качестве входных данных из интерфейса командной строки.Я читал об указателях на понятия указателя и хочу знать, правильно ли мое определение относительно того, что мне нужно.Так что в основном мне нужен массив структур, которые можно динамически расширять как по строкам, так и по столбцам.Я сделал это до сих пор.

В глобальной области действия

struct st2_D
{
uint8_t ucvar1;
uint32_t ui32var2; 
}
st2_D ** ppst2_D;

В main() у меня есть следующее определение:

ppst2_D = new st2_D * [rows]
for(uint32_t var = 0; var < rows; var++) ppst2_D[var] = new st2_d[cols]

Так будетэто создать массив структур с заданными строками и столбцами?Кроме того, как я получу доступ к элементам структуры в определенной строке и столбце?

1 Ответ

1 голос
/ 24 сентября 2019

Эти операторы

ppst2_D = new st2_D * [rows]
for(uint32_t var = 0; var < rows; var++) ppst2_D[var] = new st2_d[cols]

создают одномерный массив указателей на тип st2_D.А затем rows создаются одномерные массивы типа ppst2_D [var].

Вы можете использовать любой из индексов, как с обычными двумерными массивами, как, например,

ppst2_D[i][j]

ИлиВы можете использовать, например, арифметику указателей, например,

*( *( ppst2_D + i ) + j )

или даже их комбинации, например,

( *( ppst2_D + i ) )[j]

или

*( ppst2_D[i] + j )

Вот примерпрограмма.

#include <iostream>
#include <iomanip>

int main() 
{
    size_t n = 5;
    int **a = new int *[n];

    for ( size_t i = 0; i < n; i++ )
    {
        a[i] = new int[n];
    }

    for ( int **p = a; p != a + n; ++p )
    {
        for ( int *q = *p; q != *p + n; ++q )
        {
            *q = q - *p + ( p - a ) * n;
        }
    }

    for ( size_t i = 0; i < n; i++ )
    {
        for ( size_t j = 0; j < n; j++ )
        {
            std::cout << std::setw( 2 ) << a[i][j] << ' ';
        }

        std::cout << '\n';
    }

    for ( size_t i = 0; i < n; i++ )
    {
        delete [] *( a + i );
    }

    delete [] a;

    return 0;
}

Его вывод

 0  1  2  3  4 
 5  6  7  8  9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 
...