Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TUTORIAL [C/C++] - LES POINTEURS


Information sur la source

Catégorie :Tutoriaux Niveau : Débutant Date de création : 03/10/2004 Date de mise à jour : 03/10/2004 10:41:56 Vu / téléchargé: 7 753 / 2 384

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (28)
Ajouter un commentaire et/ou une note

Description

Comme l'indique le titre, cette source va servir à apprendre aux débutants qu'est-ce qu'un pointeur,pourquoi l'utiliser, comment l'utiliser etc...en espérant qu'il vous sera utile :)
 

Conclusion

ben pas de bugs pour un tuto je pense
en espérant qu'il va servir!
Alp
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

03 octobre 2004 09:48:41 :
Rajout d'un tout petit paragraphe :)
03 octobre 2004 10:41:56 :
Titre

Commentaires et avis

signaler à un administrateur
Commentaire de AlexMAN le 03/10/2004 10:16:36

Bonjour,

Tout d'abord, bien le tut, j'ai été agréablement surpris, mais un truc me chagrine :

"De telles considérations justifient souvent l’emploi de pointeurs à la place des tableaux,
en particulier pour les opérations que l’on souhaite rapides,
comme celles sur les chaînes de caractères par exemple."

La jsuis pas trop d'accord, puis ce kun tableau et un pointeur sont, on peut dire, ekivalent :

*(tab + i) <=> tab[i] <=> i[tab]

Donc pour moi, votre remarque n'est pas trop justifié. Dans certains cas, l'utilisation des pointeurs sera benefik, mais pas ds ts..

Si je me trompe, n'hesitez pas a me le dire,
Bonne continuation

++


signaler à un administrateur
Commentaire de Alpacha le 03/10/2004 10:21:18

Ben d'abord merci, j'ai fait aussi bien que je pouvais :)
Ensuite oui ils sont en effet équivalent puisqu'un tableau est en fait une sorte de pointeur mais comme je l'ai dit, "justifient souvent" <<< pas tout le temps :) c'est juste que je m'en sers beaucoup plus que les tableaux pour un gain de rapidité dans tout ce qui est graphisme, vous voyez ce que je veux dire?
Voila merci pour la remarque,
++
Alp

signaler à un administrateur
Commentaire de AlexMAN le 03/10/2004 10:34:56

Mais ke tu (jprefere...dsl) utilises un tableau ou un pointeur ds une boucle, comme :

for (i = 0; i < 100000; ++i) {
  tab[i] = .... ou *(tab + i) = ...
}

Ce sera exactement la mm chose ! Donc je ne vois pas trop ds kel cas un pointeur est plus rapide kun tableau..

++

signaler à un administrateur
Commentaire de AlexMAN le 03/10/2004 10:37:43

Ah et si jpeux me permettre, remplace le titre de ta source, enleve moi ce "assez", mets un truc du genre :

"Tutorial [C/C++] : Les pointeurs"

Ca donnera vachement plus envie de le lire car on se sera sur ke ce n'est pas de la merde...

Voila

++

signaler à un administrateur
Commentaire de Alpacha le 03/10/2004 10:39:30

Mais je n'utilise pas les pointeurs que pour cette boucle ^^
le tableau tant qu'il na pas vérifié tous ces octets doit continuer à se remplir jusqu'à i(en imaginant tab[i]) tandis qu'un pointeur lorqu'il a récupéré le contenu de l'adresse mémoire il peut être traité.
Je suis d'accord que pour 10 pointeurs on ne gagne pas grand chose, mais pour des jeux etc...cela peut être bénéfique.
Enfin voila :)
a+

signaler à un administrateur
Commentaire de Alpacha le 03/10/2004 10:40:38

ok je le change, merci du conseil :)
Alp

signaler à un administrateur
Commentaire de DeAtHCrAsH le 03/10/2004 11:21:20

AlexMan> L'interet des pointeur est tout simplement de pouvoir acceder au zone mémoire et d'y modifier le contenu par l'intermédiaire d'une fonction, qui plus est, permet de faire un push de seuleument 4 octets contre 8 par exemple pour une fonction prenant en paramètres un double.

Il est sure que pour des variables utilisées localement, les pointeurs reste peu utile sauf pour l'appel a des fonctions tierces.

Voila pour ma part ou je vois l'interet des pointeurs.

Shell

signaler à un administrateur
Commentaire de Alpacha le 03/10/2004 11:34:38

Oui, entre autre. Mais les pointeurs sont vraiment utile et efficaces, même si cela ne saute pas aux yeux.
sur ce, bonne journée
Alp

signaler à un administrateur
Commentaire de AlexMAN le 03/10/2004 11:35:45

Ah mais je vois lintéret des pointeurs, mais ds l'exemple donné, il ny en avait pas, c tt ske je voulais dire.

signaler à un administrateur
Commentaire de AlexMAN le 03/10/2004 11:36:50

Bien sur ke les pointeurs ont un grand intéret, leur traduction en asm sera parfaite pour le compilo : un registre. Donc bien entendu k'utiliser les pointeurs est une bonne chose..

++

signaler à un administrateur
Commentaire de Alpacha le 03/10/2004 11:37:44

ahhh ok
ben forcément l'exemple n'est qu'un exemple pour expliquer à ceux qui ne voient pas encore bien ce que c'est à quoi ca sert, ou simplement ceux pour qui c'est flou
A+

signaler à un administrateur
Commentaire de DeAtHCrAsH le 03/10/2004 12:01:13

AlexMan> Oui en effet l'exemple est plutot mal choisi.

Alpacha> Ecoute AlexMan et change ton exemple pour en mettre un plus paralant.

Shell

signaler à un administrateur
Commentaire de eRoZion le 03/10/2004 13:18:18

Je viens de le survoler et il a l'air très bien ce petit tuto. :)

Bonne initiative parce que c'est important de bien comprendre la notion de pointeur, ca servira à pas mal de débutants à mon avis.

Je le lirai bientôt dans son intégralité et je te dirai si je trouve qqchose de bizarre, mais à prioris si AlexMAN et DeAtHCrAsH n'ont rien trouvé de particulier, j'en trouverai pas plus.

Merci à tous ceux qui prennent le temps de faire des tutos.


eRoZion

signaler à un administrateur
Commentaire de Alpacha le 03/10/2004 13:21:58

merci
j'ai justement fait un tuto la-dessus car c'est très important et parfois bizarre à comprendre
en espérant que ca éclaire ceux pour qui cette notion est encore floue
Alp

signaler à un administrateur
Commentaire de plus_plus_fab le 03/10/2004 14:48:58

"Bien sur ke les pointeurs ont un grand intéret, leur traduction en asm sera parfaite pour le compilo : un registre. "
pas forcément !
le compilateur fait ce qu'il veut ! Il y a le mot clé register pour demander à ce qu'une variable (ou pointeur) soit dans un registre, mais meme avec ça, le compilo peut tres bien ne pas tenir compte de cette recommandation, alors impossible de le garantir ...

++fab

signaler à un administrateur
Commentaire de AlexMAN le 03/10/2004 14:58:24

"rien a voir, le compilo fournira un code optimisé donc comme il le souhaite, mais un pointeur ne pourra pas etre transposé autrement ke sous la forme dun registre car optimisé au max. "
Voila ce ke je dirais, mais je ne suis pas sur a 100%, donc jattend la confirmation d"une personne tierce et ne dis ca ke de maniere incertaine, donc ce n'est pas a prendre en compte..

++

signaler à un administrateur
Commentaire de plus_plus_fab le 03/10/2004 15:16:43

un pointeur, ça va sur la pile, comme les variables locales. il  y a un nombre plutot limité de registre d'ailleurs ... Seul les pointeurs (ou variables)  non déclarés volatile et "élus" pas le compilo  y auront acces.

signaler à un administrateur
Commentaire de vecchio56 le 03/10/2004 16:27:26 administrateur CS

Une question que je me suis toujours posée:

si p est un int*,
est-il plus rapide de faire *p que *(p + 4), ou est-ce équivalent?
Si la premiere est plus rapide, l'utilité d'un pointeur est indénialbe par rapport à un tableau lors d'un parcours.
Par curiosité, quel était le titre initial du source?

signaler à un administrateur
Commentaire de plus_plus_fab le 03/10/2004 16:42:24

C'est équivalent du point de vue algorithmique, c'est ce qu'on appelle un acces aléatoire (en O(1)), il ya un cout ridicule à ajouter 4 à p, donc dans l'absolue, c'est un chouia plus lent.
Mais actuellement, tous les compilateurs traduisent les parcours de tableau à l'aide de pointeurs. Donc que tu parcours un tableau avec un pointeur ou en accedant à un élément avec p[i] (= *(p+i) ), c'est identique.

@+

signaler à un administrateur
Commentaire de vecchio56 le 03/10/2004 16:50:09 administrateur CS

Je trouve ta réponse contradictoire: si c'est "un chouia plus lent", ce n'est pas équivalent, surtout que le chouia se multiplie.

signaler à un administrateur
Commentaire de plus_plus_fab le 03/10/2004 16:57:25

equivalent du point de vue algorithmique !
un algorithme en O(n+1) est equivalent à O(n), et un autre algo en O(n+100000) est equivalent à O(n).
O(n+100000) est plus lent que O(n+1) mais ils ont tout les deux la meme complexité algorithmique. Il faut voir ça lorsque n tend vers l'infini.
C'est plus clair ?
comme je le disais, de toute façon, ça reviens au meme avec un compilateur digne de ce nom.

signaler à un administrateur
Commentaire de steve_clamage le 03/10/2004 18:53:23

je pense que le tuto est moyen, il y a les grandes bases mais certains points sont a revoir

d'abord il faut que ce soit du c, a cause des void* et du transtypage a la "c", donc les cout << n'ont rien a faire ici

int i = pi2 - pi; c'est dangeureux et non portable, en c il ne faut jamais presupposer la logique d'adressage de la machine sur laquel on travail (un decalage d'adresse peut ne pas etre negatif), la maniere la plus portable est d'utilisée le type prevu pour, ptrdiff_t defini dans le standard

il ne faut pas croire que parcourir un tableau avec un pointeur est plus performant, il vaut mieux utiliser l'operateur [] et laisser faire l'optimiseur, comme plus_plus_fab l'a dit

ca aurais ete bien aussi de parler d'autres subtilités comme le cast de l-value

signaler à un administrateur
Commentaire de leprov le 03/10/2004 23:14:21

shell > j'ai vu un message que tu as ecrit plus haut.....si on est bien en c++, pour economiser 4 octets dans le cas du passage d'un double en parametres d'un fonction, on n'utilise pas un pointeur qui alourdit l'ecriture mais une référence -> cette remarque est valable en c mais pas en c++

signaler à un administrateur
Commentaire de DeAtHCrAsH le 05/10/2004 20:47:59

leprov> Comme dirait BruNews NENNI!
Références et pointeurs sont strictements identiques d'un point de vue résultats et otpimisations.
La seule différence réside dans leur utilisation.
Une référence est plus simple a utiliser.
Maintenant a chacun son droit d'y trouver son profit dans l'une ou l'autre des méthodes.

Pour te simplifier la chose dit toi que référence = pointeur syntaxiquement simplifié.

Shell

signaler à un administrateur
Commentaire de leprov le 05/10/2004 21:26:51

shell > je suis tt a fait daccord que le resultat est le meme, c'est ce que j'ai voulu dire ds mon message precedent...ce que j'ai dit est simplement que l'ecriture est alourdie (et seulement l'ecriture) lorsque tu utilise des pointeurs, dc quand tu peux eviter et utiliser une reference ca te fait un code moins "lourd" (pas en terme de performance mais de lisibilité et d'écriture)

sinon on est d'accord

signaler à un administrateur
Commentaire de stephane_1979 le 12/10/2004 09:16:33

Salut à tous,
AlexMan > l'utilisation des pointeurs plutot que l'utilisation de tableaux est TRES avantageuse quand on développe sur des systèmes embarqués qui ont en majorité des processeurs largement plus lent que ceux d'un PC ou un MAC. Mais aussi les Systèmes embarqués ont beaucoup moins d'espace mémoire et les tableaux en prennent énormement.

signaler à un administrateur
Commentaire de cynix le 13/08/2005 12:51:41

le fait est que la taille des pointeurs est variable et peut-etre libérée de la memoire a tout moment contrairement aux tableaux qui prennent un certain espace défini du debut a la fin du prog.

signaler à un administrateur
Commentaire de toxv le 02/04/2006 14:42:26

L'utilisation d'un pointeur ou d'un index pour accéder aux éléments d'un tableau ne fait absolument aucune différence ! Le compilateur fait toujours comme il veut... j'irai même plus loin :
- un bon compilateur doit produire un code identique dans les deux cas.
- et croire que l'utilisation de pointeur ou dun index fait une différence est une grave erreur (de débutant)...

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.