2010-07-20 1 views
4

La sortie de la fonction suivante est "int *", ce qui signifie que le paramètre formel est converti en un pointeur entier. Y a-t-il une raison nécessaire à cette conception? Pourquoi ne pouvons-nous pas réserver le type de tableau?Pourquoi le type de tableau du paramètre formel d'une fonction a-t-il été converti en pointeur?

// the output is "int *" 
#include<typeinfo> 
void Func(int ar[5]) 
{ 
    printf("%s\n", typeid(ar).name(); 
} 
int main() 
{ 
    int ar[5]; 
    Func(ar); 
    return 0; 
} 
+0

Voir aussi cette réponse: http://stackoverflow.com/questions/3264611/arguments-in-a-function-prototype/3264641#3264641 –

Répondre

7

est-il une raison nécessaire pour cette conception?

Ce bagage historique est de C. Soi-disant 1 c'était commodité vous ne pouvez pas passer des tableaux de valeur de toute façon.

Si vous souhaitez conserver le type, vous pouvez utiliser une des références ou des pointeurs:

void Func(int (&ar)[5]); 

ou en utilisant les fonctions de modèle pour accepter un tableau arbitraire de taille:

template<std::size_t N> void Func(int (&ar)[N]); 
+0

@sbi: 'template void func (T (& ar) [N]) 'est encore meilleur. : P –

+0

& @Prasoon: Les gens pensent souvent aux templates quand ils ont besoin de quelque chose pour travailler avec des _types_ différents, mais ils oublient généralement les arguments de template non-type. – sbi

2

J'aimerais ajouter que cela s'appelle "la désintégration de la matrice" et il y a une bonne discussion de celui-ci ici:

L'utilisation de tableaux raw dans C++ est un peu "c-style". Les vrais adeptes C++ utilisent std :: vector, qui n'a aucun problème de désintégration et de typage. Néanmoins, le code hérité est plein de tableaux bruts et les compilateurs "C++" doivent jouer sous les règles "C" pour assurer la compatibilité.

Questions connexes