2011-09-30 4 views
3

Il y a un tel code:Pointeurs de tableau à deux dimensions

int (*ptr_)[1] = new int[1][1]; 
ptr_[0][0] = 100; 
std::cout << "to: " << &ptr_ << ' ' << ptr_ << ' ' << *ptr_ << ' ' << &(*ptr_) << ' ' << **ptr_ << std::endl; 

Le résultat est:

to: 0xbfda6db4 0x9ee9028 0x9ee9028 0x9ee9028 100 

Pourquoi les valeurs de ptr_ et * ptr_ sont les mêmes? La valeur de ptr_ est égale à 0x9ee9028, donc la valeur de la cellule de mémoire 0x9ee9028 est * ptr_ qui est 0x9ee9028, cependant ** ptr_ donne le résultat 100. Est-ce logique?

+0

Je suis curieux de savoir quelle sera la réponse exacte, mais je suis sûr que cela aura quelque chose à voir avec les tableaux étant essentiellement des pointeurs. – Pat

+2

@Pat: vous voulez dire, * les variables de type tableau * étant essentiellement des pointeurs. –

+0

@larsmas: D'où ma non-réponse, heh. : P – Pat

Répondre

3

ptr_ est un pointeur sur un tableau de longueur un. Les variables de type tableau en C et C++ se dégradent simplement en pointeurs lorsqu'elles sont imprimées (entre autres). Ainsi, lorsque vous imprimez ptr_, vous obtenez l'adresse du tableau. Lorsque vous imprimez *ptr_ vous obtenez le tableau lui-même, qui se dégrade à nouveau dans ce même pointeur.

Mais en C++, veuillez utiliser des pointeurs intelligents et des conteneurs standard.

+0

Les tableaux ne se dégradent pas en pointeurs. Les variables de type tableau se dégradent en variables de type pointeur. Le tableau reste indemne. –

+0

@Tomalak Geret'kal Merci pour la correction. –

1
int main() { 
    int test[2][3] = { {1,2,3}, {4, 5, 6} }; 
    int (*pnt)[3] = test; //*pnt has type int[3] 

    //printArray writes array to stdout 
    printArray(3, *pnt); //returns 1 2 3 
    printArray(3, *(pnt+1)); //returns 4 5 6 
    return 0; 
} 

matrices de mutL-dimensionnel sont vraiment des tableaux pour des tableaux, par exemple essai [2] [3] est un tableau à deux éléments qui sont de type int [3], qui ont à leur tour 3 éléments entiers.

Dans votre cas, vous avez un pointeur vers un pointeur sur une variable.

En d'autres termes, votre tableau ressemble à ceci:

array = {{100}} 
  1. points de ptr_ à tableau
  2. & ptr_ est l'adresse de réseau externe
  3. ptr_ est l'adresse du premier élément (qui est à un autre tableau)
  4. * ptr_ même que ci-dessus
  5. & (* ptr_) obtient premier élément du tableau externe qui est le tableau innter, puis retourne l'adresse du tableau innter
  6. ** ptr_ obtient le premier élément du tableau externe (qui est le tableau interne) puis déréférence le tableau interne qui est une valeur actuall
Questions connexes