Combien de pointeurs ( `` ) sont autorisés dans une seule variable ?
Prenons l’exemple suivant.
De même, nous pouvons avoir
et ainsi de suite.
Par exemple,
Combien de pointeurs ( `` ) sont autorisés dans une seule variable ?
Prenons l’exemple suivant.
De même, nous pouvons avoir
et ainsi de suite.
Par exemple,
L' C
norme spécifie la limite inférieure:
5.2.4.1 Traduction limites
276 La mise en œuvre doit être en mesure de traduire et d'exécuter au moins un programme qui contient au moins une occurrence de chacune des limites suivantes: [...]
279 — 12 pointeur de tableau, et la fonction declarators (toutes les combinaisons) la modification d'une l'arithmétique, de la structure, de l'union, ou de type void dans une déclaration
La limite supérieure est de la mise en œuvre spécifique.
En fait, les programmes en C font fréquemment usage de l'infini pointeur d'adressage indirect. Un ou deux statique niveaux sont communs. Triple indirection est rare. Mais l'infini est très commun.
Infini pointeur d'adressage est réalisé avec l'aide d'un struct, bien sûr, pas un accès direct à un jugement de nullité, ce qui serait impossible. Et une structure est nécessaire de sorte que vous pouvez inclure d'autres données dans cette structure à différents niveaux où cela peut se terminer.
struct list { struct list *next; ... };
maintenant vous pouvez avoir list->next->next->next->...->next
. C'est vraiment juste plusieurs pointeur indirections: *(*(..(*(*(*list).next).next).next...).next).next
. Et l' .next
est essentiellement un noop quand il est le premier membre de la structure, de sorte que nous pouvons imaginer ce qu' ***..***ptr
.
Il n'y a vraiment pas de limite sur ce point car les liens peuvent être parcourus avec une boucle plutôt qu'un géant de la manifestation de ce genre, et de plus, la structure peut être facilement fait en circulaire.
Donc, en d'autres termes, les listes liées peut-être l'exemple ultime de l'ajout d'un autre niveau d'indirection pour résoudre un problème, puisque vous le faites de façon dynamique à chaque opération push. :)
Théoriquement:
Vous pouvez avoir autant de niveaux d'indirections que vous le souhaitez.
Pratiquement:
Bien sûr, rien de ce qui consomme de la mémoire peut être de durée indéterminée, il y aura des limitations en raison des ressources disponibles sur l'hôte de l'environnement. Donc, pratiquement il y a une limite maximale à ce qu'une mise en œuvre peut prendre en charge et la mise en œuvre du document de manière appropriée. Donc, dans tous ces artefacts, la norme ne précise pas la limite maximale, mais il ne précise pas les limites les plus basses.
Voici la référence:
Standard C99 5.2.4.1 Traduction limites:
- 12 pointeur de tableau, et la fonction declarators (toutes les combinaisons) la modification d'une l'arithmétique, de la structure, de l'union, ou de type void dans une déclaration.
Ceci spécifie la limite inférieure que chaque mise en œuvre doit de soutien. Notez que dans un footenote la norme dit encore:
18) les Implémentations devraient éviter d'imposer fixe les limites de la traduction à chaque fois que possible.
Comme n’ont dit, aucun limite « en théorie ». Toutefois, par curiosité, j’ai couru ce avec g ++ 4.1.2, et cela a fonctionné avec la taille jusqu'à 20 000. Compilation n’était assez lente, donc je n’ai pas essayé plus haut. Donc je dirais g ++ n’imposer aucune limite non plus. (Essayez de définir `` et à la recherche en ptr.cpp, si ce n’est pas immédiatement évident.)
``
Create.cpp
Sons amusants pour vérifier.
erreur irrécupérable C1026 : débordement de pile d’analyseur, programme trop complexe
- GCC (Ubuntu), 100 k + `` sans fracas ! Je suppose que le matériel est la limite ici.
(testé avec juste une déclaration de variable)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.