создание массивов указателей в c ++ с помощью нового ключевого слова - PullRequest
0 голосов
/ 13 октября 2018

В чем смысл кода ниже?

int **matrix = new int*[n]

В чем разница между matrix и int*[n]?

Ответы [ 7 ]

0 голосов
/ 14 октября 2018

Было бы абсолютно ясно, если вы помните ассоциативность и приоритет операторов.

Исходя из этого int * [n] будет интерпретироваться компилятором: как массив "n указателей на целые числа". (As [] имеет больший приоритет, чем *, поэтому для простоты понимания компилятор интерпретирует его таким образом.).

Теперь переход на другую сторону int ** matrix - указатель на указатель.Когда вы создали массив указателей, у вас в основном есть адрес первого местоположения, здесь первое местоположение хранит указатель на целое число.

Итак, когда вы сохраняете адрес первого адреса такого массива, вы будетенужен указатель на указатель, чтобы указать весь массив.

0 голосов
/ 28 августа 2019

// код для передачи матрицы в качестве указателя и возврата в качестве указателя

 int ** update(int ** mat)
{
    mat[0][1]=3;


    return mat;
}


int main()
{   int k=4;
    int **mat = new int*[k];

           for(auto i=0; i < k; i++)
           {
               mat[i] = new int[k];
               for(int j=0;j<k;j++)
               {
                   if(i==j)
                     mat[i][j]=1;
                   else
                    mat[i][j]=0;
               }

           }

          mat=update(mat);
           for(auto i=0; i < k; i++)
           {

               for(auto j=0; j < k; j++)
                   cout << mat[i][j];
               cout << "\n";
           }
    return 0;
}
0 голосов
/ 13 октября 2018

matrix является объектом типа int **.Этот тип является указателем на указатель на int.

С другой стороны, int * - это тип , указатель на int.

. выражение :

new int*[n]

создает n смежные объекты типа int * где-то в памяти и возвращает указатель на первый из них.Другими словами, он выделяет и создает n указатели на int;и возвращает указатель на первый.Поскольку первый (и каждый из них) int *, указатель , указывающий на первый , в свою очередь, имеет тип int **.

0 голосов
/ 13 октября 2018

Вы должны заметить следующее:

  • int *p означает, что p - это указатель, который указывает на переменную int или указывает на массив переменных int.
  • int* *p означает, что p - это указатель, который указывает на переменную int* или на массив int* переменных.
  • new int[5] - это массив 5 int переменных.
  • new int*[5] - это массив из 5 int* переменных.

В этом случае matrix - это второй тип, поэтому он может указывать на массивint* переменных, поэтому утверждение: int **matrix = new int*[n] допустимо

0 голосов
/ 13 октября 2018

Это массив 'n' указателей, для которых память может быть выделена и инициализирована в цикле.Если n равно 3, это массив из 3 элементов, каждый из которых является указателем на int и может указывать на набор массивов целочисленных значений, как показано ниже.

            matrix[0] -> Ox001  points to  array of int [ 1 2 3 4]
            matrix[1] -> Ox017                          [ 5 6 7 8]
            matrix[2] -> Ox024                          [ 9 10 11 12]

Пример кода, подобный этому

           int **m = new int*[3];
           for(auto i=0; i < 3; i++)
           {
               m[i] = new int[3];
               for(auto j=0; j < 3; j++)
                   m[i][j] = 0;
           }


           for(auto i=0; i < 3; i++)
           {
               m[i] = new int[3];
               for(auto j=0; j < 3; j++)
                   cout << m[i][j];
               cout << "\n";
           }
0 голосов
/ 13 октября 2018

например, есть команда по крикету, и вам нужно

Поскольку у вас есть команда по крикету *, это означает, что у вас есть одна из двух возможных ситуаций

:

1)указатель на один тип CricketPlayer (или любой производный)

2) указатель на массив типов CricketPlayer (но не производный).

Вам нужен указатель на массивCricketPlayer или производные типы.Таким образом, вам

понадобится **.

Вам также нужно будет распределить каждого члена команды индивидуально и присвоить их массиву:

            // 5 players on this team

          CricketPlayer** team = new CricketPlayer*[5];

          // first one is a bowler

          team[0] = new Bowler();

         // second one is a hitter

          team[1] = new Hitter();

           // etc

// затемосвободить память

         delete team[0];
         delete team[1];
         delete[] team;

В вашем запросе

           It can be understood as

              int *matrix[]=new int*[n];

SO есть n указателей, указывающих на n мест.

Потому что

               int *foo;

                foo=new int[5];

также создаст 5 последовательных мест, но это тот же указатель.

see this

В нашем случае это массив указателей

0 голосов
/ 13 октября 2018

Это означает, что вы объявили двойной указатель (типа int) с именем matrix и выделили массив из n указателей int *.Теперь вы можете использовать matrix [i] в ​​качестве указателя на int * (0 <= i <n).Позже вы можете захотеть выделить память для отдельных указателей, например, matrix [i] = new int [size]; (size - это int или, более точно, size_t) </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...