Comment en C++ obtenir la longueur d'un tableau avec des pointeurs uniquement? Je sais que le nom de l'onglet est pointeur sur le premier élément, mais que faire ensuite?Longueur du tableau avec des pointeurs
Répondre
Vous ne pouvez pas. Un pointeur est juste un emplacement de mémoire, et ne contient rien de spécial qui pourrait déterminer la taille.
Puisque c'est C++, ce que vous pouvez faire est de passer le tableau par référence comme ceci:
template <typename T, size_t N>
void handle_array(T (&pX)[N])
{
// the size is N
pX[0] = /* blah */;
// ...
pX[N - 1] = /* blah */;
}
// for a specific type:
template <size_t N>
void handle_array(int (const &pX)[N]) // const this time, for fun
{
// the size is N
int i = pX[0]; // etc
}
Mais sinon, vous devez passer commencer & fin et faire une soustraction, comme l'indique Alok, un début & taille, comme vous le suggérez, ou fossé un tableau statique et utiliser un vecteur, comme le suggère Tyler.
Si vous connaissez la taille du tableau que vous allez travailler avec, vous pouvez faire une typedef
:
typedef int int_array[10];
void handle_ten_ints(int_array& pX)
{
// size must be 10
}
Et juste pour la taille:
template <typename T, size_t N>
size_t countof(T (&pX)[N])
{
return N;
}
template <typename T, size_t N>
T* endof(T (&pX)[N])
{
return &pX[0] + N;
}
// use
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};
size_t count = countof(someArray); // 9
std::for_each(someArray, endof(someArray), /* ... */);
J'utilise ces fonctions d'utilité de temps en temps.
Vous ne pouvez pas le faire. Vous devez transmettre la longueur du tableau avec le pointeur de tableau, ou vous devez utiliser un objet conteneur tel que std::vector
.
Et bientôt std :: array :) – coelhudo
À ce stade, je m'attends à la collecte de la sécurité sociale au moment où C++ 4x est finalisé. –
Je ne vois pas quel est le problème: vous pouvez utiliser boost :: array dès maintenant. –
Vous voulez dire quelque chose comme:
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
Non, un pointeur "fin" est classiquement un-passé-la-fin (ce qui est légal) spécifiquement pour que end - start = length, et que vous puissiez faire des choses comme 'for (int * i = start; i! = fin; ++ i)'. –
@Tyler: merci. –
Vous ne pouvez pas, sauf si vous savez ce que le pointeur de fin déréférence à. Dans le cas des tableaux char, c'est un '\ 0', donc vous pouvez faire une boucle jusqu'à ce que vous lisiez ce caractère pour déterminer la longueur.
Dans le cas de * strings *, c'est classiquement '\ 0'. Tous les tableaux char ne sont pas des chaînes. – Potatoswatter
- 1. Comment obtenir la longueur du tableau de pointeurs C?
- 2. Tableau de pointeurs
- 3. tableau 2D par des pointeurs
- 4. longueur de calcul du tableau
- 5. obtenir l'adresse du tableau de pointeurs en pointeurs sur char
- 6. Comment déclarer des pointeurs triple dans le tableau de pointeurs
- 7. Initialiser un tableau de pointeurs vers des pointeurs
- 8. Comment déterminer la longueur totale des caractères d'un tableau de pointeurs char?
- 9. Utilisation d'un tableau avec des pointeurs en C
- 10. tableau de pointeurs vers des tableaux multidimensionnels
- 11. Tableau de tri C++ des pointeurs char
- 12. tableau double par des pointeurs en C
- 13. tableau de remplissage C avec des pointeurs de classe personnalisée
- 14. va_arg avec des pointeurs
- 15. mergesort tableau d'int utilisant des pointeurs
- 16. longueur de chaîne entre les pointeurs
- 17. Utilisation du tableau de longueur nulle
- 18. Tableau de longueur
- 19. Attribuer un tableau de pointeurs au tableau
- 20. tableau de N pointeurs vers des fonctions renvoyant des pointeurs vers des fonctions
- 21. pointeurs vers des pointeurs et des tableaux de pointeurs
- 22. tableau de pointeurs vers un tableau char
- 23. Seg Défaut avec des pointeurs malloc'd
- 24. Comment écraser un tableau de pointeurs char avec une plus grande liste de pointeurs char?
- 25. C - Problèmes avec des pointeurs vers des pointeurs, peut ne pas sembler le voir
- 26. Modification du contenu dans un tableau de pointeurs de caractères
- 27. Utiliser des pointeurs avec des fonctions et des structures
- 28. Délocaliser un tableau de pointeurs vers des objets?
- 29. Passer un tableau contenant des pointeurs à une fonction bien
- 30. Noyau Linux: copy_from_user - struct avec des pointeurs
Il est préférable d'utiliser 'typedef' pour créer un type de tableau, et d'accepter une référence à cela, pour éliminer le' template', à moins que ces méthodes ne soient dans un fichier d'en-tête et que la taille du tableau varie déterministe à la compilation). – Potatoswatter
@Potatoswatter: Je ne suis pas au courant d'un moyen de faire un typedef comme ça. N n'est pas connu de la fonction tant qu'elle n'est pas instanciée avec un appel. Je vais ajouter un exemple de typedef, c'est ce que vous vouliez dire? – GManNickG
Oui, l'exemple typedef que vous avez ajouté est ce que je voulais dire. 'template' est sympa avec la taille automatique 'int ary [] = {...};' mais l'instanciation peut être gênante/confuse et le bénéfice est FAIBLE à moins que le tableau ne soit déclaré comme ça. Ou l'utilisateur arrive à travailler avec plusieurs tailles fixes. –
Potatoswatter