2010-08-26 3 views
3

Je lis actuellement un certain C++ code source, et je suis tombé sur ceci:Qu'est-ce que ** en C++

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

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

Pas tout à fait sûr de ce qu'il fait ou ce que cela signifie. Est-ce un pointeur ... vers un autre pointeur?

Il y a également les éléments suivants:

double ***weight; 

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

Je suis assez confus: P, toute aide est appréciée.

+2

vous devez utiliser la fonctionnalité de formatage du code de l'éditeur de publication, rend les messages plus lisibles – sum1stolemyname

Répondre

8

new double*[num] est un tableau de pointeurs doubles-à-dire chaque élément du tableau est un double*. Vous pouvez allouer de la mémoire pour chaque élément en utilisant out[i] = new double; De même weight est un tableau de double**. Vous pouvez allouer de la mémoire pour chaque élément de poids en utilisant new double*[num] (si elle est censée être un tableau de double*)

+0

Merci pour l'aide – dcousens

+3

+1, meilleure réponse.Cependant, l'allocation séparée de chaque «double» n'est probablement pas une bonne idée, surtout pour une application scientifique. Mieux vaut allouer un tableau plat de doubles, et tous les pointeurs pointent vers les éléments de ce tableau. – Potatoswatter

2

C'est un pointeur vers le pointeur vers le double. Ou tableau de pointeurs à doubler. Ou si chaque pointeur lui-même alloue un tableau, il peut s'agir d'une matrice.

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

Maintenant, il depents si out[0] est affecté comme suit:

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

ou comme ceci:

out[0] = new double[num]; // now you've got a matrix 
1

En fait, l'écriture

double*[] out; 

est en C/C++ égale à

double** out; 

et cela signifie un tableau de pointeurs à doubler. Ou un pointeur vers des pointeurs de double. Parce qu'un tableau n'est rien de plus qu'un simple pointeur. C'est donc essentiellement un tableau à deux dimensions.

Vous pouvez aussi bien écrire

double[][] out; 

Et aussi, en ajoutant un autre niveau de pointeur, va ajouter une autre dimension à votre tableau. Alors

double ***weight; 

est en fait un pointeur sur un tableau en trois dimensions.

+2

Non 'double * [] out;' est une erreur de syntaxe. 'double * out [];' déclarerait un tableau de 'double *', pas un pointeur. Les tableaux et les pointeurs sont des types distincts; par exemple, vous ne pouvez pas assigner à un tableau, donc 'out = new double * [num];' serait invalide. –

1

Fondamentalement, vos deux fragments de code allouent un tableau de pointeurs. Pour l'attribution, cela n'a pas d'importance pour quoi. Une déclaration correcte est nécessaire uniquement pour les vérifications de type. Les bracjets carrés doivent être lus séparément et signifie seulement que c'est un tableau.

Considérez code suivant comme exemple rapide:

#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; 
} 

Oui, les deux ne sont que des pointeurs. Et la mémoire allouée est sizeof (double *) * num.