Что ** в C ++ - PullRequest
       36

Что ** в C ++

3 голосов
/ 26 августа 2010

В настоящее время я читаю некоторый исходный код C ++, и я столкнулся с этим:

 double **out;
 // ... lots of code here 

 // allocate memory for out
 out = new double*[num];

Не совсем уверен, что он делает, или что это значит. Это указатель ... на другой указатель?

Существует также следующее:

 double ***weight;

 // allocate memory for weight
 weight = new double**[numl];

Я совершенно сбит с толку: P, любая помощь приветствуется.

Ответы [ 4 ]

8 голосов
/ 26 августа 2010

new double*[num] - это массив двойных указателей, т.е. каждый элемент массива - это double*. Вы можете выделить память для каждого элемента, используя out[i] = new double; Аналогично weight - это массив double**. Вы можете выделить память для каждого элемента веса, используя new double*[num] (если предполагается, что это массив double*)

2 голосов
/ 26 августа 2010

Это указатель на указатель на double.Или массив указателей для удвоения.Или, если каждый указатель сам выделяет массив, это может быть матрица.

out = new double*[num]; // array of pointers

Теперь это зависит от того, выделено ли out[0] так:

out[0] = new double; // one double

или как это:

out[0] = new double[num]; // now you've got a matrix
1 голос
/ 26 августа 2010

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

Рассмотрим следующий код в качестве быстрого примера:

#include <stdio.h>

int main()
{
    unsigned num = 10;
    double **p1, ***p2;

    p1 = new double*[num];
    p2 = new double**[num];

    printf("%d\n", sizeof(p1));
    printf("%d\n", sizeof(p2));

    delete [] p1;
    delete [] p2;

    return 0;
}

Да, оба являются просто указателями.И выделенная память это sizeof (double *) * num.

1 голос
/ 26 августа 2010

На самом деле, запись

double*[] out;

в C / C ++ равна

double** out;

, и это означает, что массив указателей должен удваиваться.Или указатель на указатели двойника.Потому что массив - это не более чем указатель.Так что по сути это двумерный массив.

Вы также можете написать

double[][] out;

И аналогично, добавив еще один уровень указателя, добавите еще одно измерение в ваш массив.Так что

double ***weight;

на самом деле является указателем на трехмерный массив.

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