2016-01-02 1 views
0
#include<iostream.h> 
void main() 
{ 
    int arr[2][3][2]={{{2,4},{7,8},{3,4},}, {{2,2},{2,3},{3,4}, }}; 
    cout<<**(*arr+1)+2+7; 
} 

Selon moi, la réponse sera 11, mais le compilateur montre 16. Quelqu'un peut-il s'il vous plaît expliquer la solution? Merci d'avanceRequête basée sur Pointer

+0

Pourquoi pensez-vous que la réponse devrait être 11? –

+4

L'expression '* arr + 1' ne fait pas ce que vous attendez de faire, je pense. Essayez d'abord de le faire fonctionner correctement avec la syntaxe d'indexation du tableau, puis utilisez graduellement chaque index du tableau pour l'arithmétique du pointeur. –

+0

@ cricket_007 En fait, j'utilise le débridement d'éléments. C'est la raison de ma mauvaise réponse. À présent. J'ai l'explication merci. –

Répondre

2

*arr est équivalent à arr[0].

*(arr[0]+1) est équivalent à arr[0][1].

*arr[0][1] est équivalent à arr[0][1][0].

Ainsi, votre code est équivalent à ceci:

#include<iostream.h> 

void main() 
{ 
    int arr[2][3][2]={ 
     {{2,4},{7,8},{3,4},}, 
     {{2,2},{2,3},{3,4},} 
    }; 
    cout << arr[0][1][0]+2+7; 
} 

arr[0][1][0] est 7, vous obtenez 7 + 2 + 7, qui est 16.

2
**(*arr + 1) + 2 + 7 

est le même que

**(arr[0] + 1) + 2 + 7 

Identique

arr[0][1][0] + 2 + 7 

arr[0][1][0] Est 7 par définition.

Ainsi, le compilateur est correct et la réponse est 16.

0

Les autres réponses sont correctes. Essayez de le faire dans votre code pour le voir en action pour vous:

#include <iostream> 
int main() 
{ 
    int arr[2][3][2]= 
     { 
     { 
      {2,4},{7,8},{3,4}, 
     }, 
     { 
      {2,2},{2,3},{3,4}, 
     } 
     }; 
    std::cout << *arr << std::endl;   // 0x7fff5a3a6710 
    std::cout << *arr+1 << std::endl;   // 0x7fff5a3a6718 
    std::cout << *(*arr+1) << std::endl;  // 0x7fff5a3a6718 
    std::cout << **(*arr+1) << std::endl;  // 7 
    std::cout << **(*arr+1)+2+7 << std::endl; // 16 

    return 0; 
}