459 votes

Combien de niveaux de pointeurs peut-on avoir ?

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,

407voto

KingsIndian Points 26855

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.

159voto

Kaz Points 18072

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. :)

83voto

Alok Save Points 115848

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.

78voto

BoBTFish Points 6610

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

63voto

mihai Points 7035

Sons amusants pour vérifier.

  • Visual Studio 2010 (sur Windows 7), vous pouvez avoir des niveaux de 1011 avant d’obtenir cette erreur :

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.com

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.

Powered by:

X