Avantages des pointeurs?
J'ai récemment développé un intérêt dans la programmation en C, alors je suis moi-même un livre (K&R) et a commencé à étudier.
À venir à partir d'un cours Universitaire en Java (notions de base), les pointeurs sont d'un tout nouveau chapitre, et de ce que j'ai lu en ligne, c'est plutôt un concept difficile à obtenir autour de votre tête. Avant d'arriver à le pointeur chapitre, j'étais sous l'impression que les pointeurs sont une partie importante de C et de fournir de grands avantages.
À la lecture de ce chapitre et d'obtenir une idée de base de ce que les pointeurs sont et comment ils fonctionnent, les avantages ne sont pas évidentes pour moi.
Par exemple (s'il vous plaît corrigez-moi si j'ai eu ce totalement faux) dans l'introduction de pointeurs dans le K&R livre il est dit que depuis que nous avons appel par valeur, lors du passage d'une variable dans un appel de fonction, nous avons assez bien transmettre une copie de la variable pour la fonction à traiter et donc la fonction ne peut rien faire pour la variable d'origine et nous pouvons surmonter cette avec des pointeurs.
Plus tard dans un autre exemple qui utilise un pointeur de char, le livre dit que l'incrémentation du pointeur de char est légal puisque la fonction a une copie privée du pointeur. Ne sont pas "copie privée" une raison d'utiliser des pointeurs à la place?
Je suppose que je suis un peu confus sur l'ensemble de l'utilisation de pointeurs. Si j'ai demandé peut utiliser des pointeurs au lieu de l'aide du tableau des indices par exemple, mais je doute que c'est la principale utilisation de pointeurs.
Linux et Open source de programmation a été la principale raison que je suis en C. j'ai obtenu le code source d'un projet C pour l'étude (Geany IDE) et je peux voir que les pointeurs sont utilisés dans le code source.
J'ai aussi fait un peu de recherche dans les forums et trouvé un couple de posts avec des questions similaires. La réponse était (je cite):
Si vous ne savez pas quand vous devez utiliser des pointeurs il suffit de ne pas les utiliser.
Il deviendra évident lorsque vous avez besoin de les utiliser, chaque situation est différente.
Est-il dangereux pour moi d'éviter d'utiliser des pointeurs pour le moment et utiliser seulement dans des situations spécifiques (d'où la nécessité pour les pointeurs seront apparente?)
source d'informationauteur Nick
Vous devez vous connecter pour publier un commentaire.
Votre mis en évidence la règle est très sage. Il va vous garder hors de l'ennui, mais tôt ou tard, vous avez à apprendre les pointeurs.
Alors pourquoi voulons-nous utiliser des pointeurs?
Dire que j'ai ouvert un fichier texte et de le lire en une gigantesque chaîne de caractères. Je ne peux pas vous passer le géant de la chaîne de valeur, car il est trop gros pour tenir sur la pile (disons de 10 mo). Si je vous dis où la chaîne est et de dire "regardez-vous là-bas à ma chaîne".
Un tableau est un pointeur ( enfin presque ).
int[] et int* sont légèrement différents, mais interchangeables pour la plupart.
Une utilisation plus poussée de pointeurs qui est extrêmement utile est l'utilisation de pointeurs de fonction. En C et C++ les fonctions ne sont pas de première classe, types de données, mais les pointeurs sont. De sorte que vous pouvez passer un pointeur à une fonction que vous souhaitez appelé et ils peuvent le faire.
J'espère que ça aide, mais plus que probablement va être source de confusion.
Un des avantages de pointeurs, c'est quand vous les utilisez dans des arguments de la fonction, vous n'avez pas besoin de copier de gros morceaux de mémoire autour, et vous pouvez également modifier l'état par un déréférencement du pointeur.
Par exemple, vous pouvez avoir une énorme
struct MyStruct
et vous avez une fonctiona()
.Venant de Java, vous aurez une perspective légèrement différente de ce qui est présenté dans le K&R (K&R de ne pas supposer que le lecteur sait tout autre langage de programmation moderne).
Un pointeur en C est un peu plus capable de la version de référence en Java. Vous pouvez voir cette similitude par le biais de l'exception Java nommé
NullPointerException
. Un aspect important des pointeurs en C est que vous pouvez changement ce qu'ils point par incrémentation et de décrémentation.En C, vous pouvez stocker un tas de choses en mémoire dans un tableau, et vous savez qu'ils sont assis côte à côte les uns des autres dans la mémoire. Si vous avez un pointeur sur l'un d'entre eux, vous pouvez faire que pointer à la "prochaine" de l'un par l'incrémentation. Par exemple:
Le code ci-dessus utilise le pointeur
p
à point pour chaque élément dans le tableaua
dans l'ordre, et de les imprimer.(Note: Le code ci-dessus est expositoire exemple seulement, et vous ne serait pas l'habitude d'écrire une boucle simple de cette façon. Il serait plus facile d'accéder aux éléments du tableau comme
a[i]
et ne pas utiliser un pointeur).Je dirais que cela signifie qu'ils sont incrémenter le pointeur lui-même, ce qui implique de changer l'adresse (et donc, le point à une valeur différente). Cela pourrait être utile si ils ont passé le premier élément d'un tableau et l'envie de continuer dans le tableau, mais pas de modifier les valeurs.
Rappelez-vous que C (et le K&R livre) très ancienne, sans doute plus que tout ce que vous avez appris avant (certainement âges âgés de plus de Java). Les pointeurs ne sont pas une caractéristique supplémentaire de C, ils sont très basique, en partie de la façon dont les ordinateurs fonctionnent.
Pointeur de la théorie n'est pas particulièrement difficile à maîtriser, seulement qu'ils sont très puissants donc une erreur sera probablement planter votre application, et les compilateurs ont un moment difficile essayer de l'attraper pointeur liées à des erreurs. L'une des grandes nouveautés de Java, a été avoir "presque" autant de pouvoir que C sans pointeurs.
Donc, à mon avis, essayer de rédiger C en évitant les pointeurs, c'est comme essayer de monter un vélo sans pédale. Oui, c'est faisable mais vous aurez à travailler deux fois plus dur.
Ignorer que la réponse s'il vous plaît.
Si vous ne savez pas comment utiliser les pointeurs, apprendre comment les utiliser. Simple.
Pointeurs comme vous le dites vous permettre de passer plus d'une variable dans une fonction via un pointeur vers elle, comme vous l'avez souligné à juste titre. Une autre utilisation des pointeurs est en se référant à des tableaux de données, que vous pouvez parcourir à l'aide de l'arithmétique des pointeurs. Enfin, les pointeurs permettent de vous allouer de la mémoire dynamiquement. Donc vous conseiller de ne pas utiliser des pointeurs va sérieusement limiter ce que vous pouvez faire.
Les pointeurs sont C est la façon de parler d'adresses de la mémoire. Pour cette raison, ils sont essentiels. Comme vous l'avez K&R, de le lire.
Pour un exemple d'utilisation, voir ma réponse à cette. Comme je l'ai dit dans cette réponse, il n'est pas forcément comment vous pouvez le faire, compte tenu de la question.
Cependant, cette technique est exactement la façon dont les bibliothèques comme MPIR et GMP de travail. libgmp si vous n'avez pas rencontré des pouvoirs mathematica, maple...) et est la de la bibliothèque pour en précision arbitraire. Vous trouverez
mpn_t
est une définition de type d'un pointeur, en fonction du système d'exploitation dépend de ce qu'il désigne. Vous trouverez également beaucoup de l'arithmétique des pointeurs dans la lenteur, C, versions de ce code.Enfin, je l'ai mentionné gestion de la mémoire. Si vous voulez allouer un tableau de quelque chose que vous devez
malloc
etfree
qui traitent des pointeurs vers des espaces de mémoire; plus précisémentmalloc
retourne un pointeur vers la mémoire une fois allouée ouNULL
en cas d'échec.L'une de mes préférées utilise des pointeurs pour faire un membre de classe C++ loi sur la fonction comme un fil sur windows à l'aide de l'API win32, c'est à dire la classe contiennent un fil. Malheureusement
CreateThread
sur windows n'accepte pas C++ des fonctions de classe pour des raisons évidentes -CreateThread
est une fonction C qui ne comprend pas les instances de classe; si vous avez besoin de passer d'une fonction statique. Voici l'astuce:(PVOID est un
void *
)Ce qui se passe est qu'il renvoie
ThreadFunc
qui est exécuté "au lieu de" (en fait STATICFUNC appelle)STATICFUNC
et peut en effet accéder à toutes les variables de membre privées deCLASSNAME
. Ingénieux, hein?Si ce n'est pas suffisant pour vous convaincre des pointeurs plutôt sont C, je ne sais pas ce que c'est. Ou peut-être il n'ya pas de point dans le C sans pointeurs. Ou...
Considérant que vous êtes en provenance d'un Java de fond, voici le moyen le plus simple pour obtenir votre tête autour de ce qui utilisent des pointeurs ont.
Disons que vous avez une classe comme ça en Java:
Ici est votre fonction principale, qui crée un de vos objets et appelle une fonction.
La
myInstance
variable déclarée à l'Main
est une référence. C'est essentiellement une poignée de la JVM utilise pour garder un œil sur votre instance de l'objet. Maintenant, laissez-nous faire la même chose en C.Bien sûr, les pointeurs sont beaucoup plus souple en C, mais c'est l'essentiel de la façon dont ils fonctionnent dans une Java.
Si vous êtes aux prises avec la mémoire allouée dynamiquement, vous devez utiliser des pointeurs pour accéder à l'espace alloué. De nombreux programmes traitent de la mémoire allouée, de sorte que de nombreux programmes ont d'utiliser des pointeurs.
Dans cet exemple:
le paramètre
i
est passé par valeur, donc la fonctionf1
ne pouvait pas changer la valeur de la variablex
de l'appelant.Mais dans ce cas:
Ici, nous avons toujours passer
px
paramètre par valeur, mais dans le même temps que nous passonsx
par refference!. Donc, si le destinataire de l'appel (f2
) va changer saint* i
elle n'aura aucun effet surpx
en l'appelant. Cependant, en changeant*i
le destinataire de l'appel permet de changer la valeur dex
en l'appelant.Permettez-moi de vous expliquer cela plus en termes de Java références (comme l'a fait remarquer @Greg réponse)
En Java, il existe des types de référence (c'est à dire la référence à une classe) et des types de valeur (c'est à dire
int
). Comme en C, Java est le passage par valeur, seulement. Si vous passez d'un type primitif dans une fonction, vous fait passer la valeur de la valeur (après tout, c'est un "type de valeur"), et, par conséquent, toute modification de cette valeur à l'intérieur de cette fonction ne sont pas reflétées dans le code appelant. Si vous passez d'un type de référence dans une fonction, vous pouvez modifier la valeur de cet objet, parce que quand vous passez le type de référence, vous passer de la référence à ce type de référence par la valeur.Pointeurs de rendre possible la dynamique de répartition de code donné des conditions ou de l'état du programme. Une façon simple de compréhension de ce concept est de penser à une structure de l'arbre où chaque nœud représente un appel de fonction, variable, ou un pointeur vers un sous-niveau du nœud. Une fois que vous comprenez cela, vous, puis utiliser des pointeurs pour pointer vers établie emplacements de mémoire que le programme peut faire référence à la volonté de comprendre la intitial de l'état, et donc la première de déréférencement et de l'offset. Ensuite, chaque nœud peut contenir son propre pointeurs afin de mieux comprendre l'état dans lequel un autre déréférencement peut avoir lieu, une fonction peut être appelée, ou une valeur de main.
Bien sûr, c'est juste une manière de visualiser comment les pointeurs peuvent être utilisés depuis un pointeur n'est rien de plus qu'une adresse d'un emplacement mémoire. Vous pouvez également utiliser des pointeurs pour la transmission de message, la fonction virtuelle appels, la collecte des ordures, etc. En fait, j'ai utilisé pour recréer style c++ virtuel des appels de fonction. Le résultat est que le c fonction virtuelle et c++ des fonctions virtuelles exécuter exactement à la même vitesse. Cependant l'implémentation c était beaucoup plus petit en taille (66% de moins en KO) et un peu plus portable. Mais la réplication des caractéristiques d'autres langues en C ne sera pas toujours avantageux, évidemment, b/c d'autres langues pourraient être mieux équipés pour recueillir de l'information que le compilateur peut utiliser pour l'optimisation de la structure de données.
En résumé, il ya beaucoup qui peut être fait avec des pointeurs. Le langage C et les pointeurs sont dévalué de nos jours b/c plus un langage de haut niveau sont équipées avec le plus souvent des structures de données /implémentations que vous auriez eu à construire sur votre propre avec l'utilisation de pointeurs. Mais il y a toujours des moments où un programmeur peut-être besoin de mettre en œuvre un complexe de routine et dans ce cas, de savoir comment utiliser les pointeurs est une très bonne chose.