Compte tenu du programme suivant,
#include using namespace std; void foo( char a[100] ) { cout << "foo() " << sizeof( a ) << endl; } int main() { char bar[100] = { 0 }; cout << "main() " << sizeof( bar ) << endl; foo( bar ); return 0; }
les sorties
main() 100 foo() 4
Oui c’est hérité de C. La fonction:
void foo ( char a[100] );
Aura le paramètre ajusté pour être un pointeur, et devient ainsi:
void foo ( char * a );
Si vous voulez que le type de tableau soit préservé, vous devez passer une référence au tableau:
void foo ( char (&a)[100] );
C ++ ’03 8.3.5 / 3:
… Le type d’une fonction est déterminé à l’aide des règles suivantes. Le type de chaque paramètre est déterminé à partir de son propre décl-spécificateur-seq et de son déclarateur. Après avoir déterminé le type de chaque paramètre, tout paramètre de type “tableau de T” ou “fonction renvoyant T” est ajusté pour être respectivement “pointeur sur T” ou “pointeur sur fonction renvoyant T”.
Pour expliquer la syntaxe:
Vérifiez la règle “droite-gauche” dans Google; J’ai trouvé une description de celui-ci ici .
Il serait appliqué à cet exemple approximativement comme suit:
void foo (char (&a)[100]);
Commencer à l’identifiant ‘a’
‘a’ est un
Déplacez-vous à droite – nous trouvons a )
alors nous inversons la direction à la recherche du (
.
‘a’ est une référence
Après le &
nous arrivons à l’ouverture (
donc nous inversons et regardons à droite. Nous voyons maintenant [100]
‘a’ est une référence à un tableau de 100
Et nous inversons la direction jusqu’à ce que nous atteignions l’ char
:
‘a’ est une référence à un tableau de 100 caractères
Oui. En C et C ++, vous ne pouvez pas passer de tableaux à des fonctions. C’est comme ça.
Pourquoi faites-vous des tableaux simples de toute façon? Avez-vous regardé boost
/ std::tr1::array
/ std::array
ou std::vector
?
Notez que vous pouvez toutefois transmettre une référence à un tableau de longueur arbitraire à un modèle de fonction. Du haut de ma tête:
template< std::size_t N > void f(char (&arr)[N]) { std::cout << sizeof(arr) << '\n'; }
Il existe un mot magnifique dans la terminologie C / C ++ utilisé pour les tableaux statiques et les pointeurs de fonctions – decay . Considérez le code suivant:
int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints //... void f(int a[]) { // ... } // ... f(intArray); // only pointer to the first array element is passed int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5) int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system