TUTORIAL [C/C++] - LES POINTEURS

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 3 oct. 2004 à 10:16
toxv Messages postés 1 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 2 avril 2006 - 2 avril 2006 à 14:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/26541-tutorial-c-c-les-pointeurs

toxv Messages postés 1 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 2 avril 2006
2 avril 2006 à 14:42
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)...
cs_cynix Messages postés 20 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 9 mars 2009
13 août 2005 à 12:51
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.
stephane_1979 Messages postés 9 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 14 octobre 2004
12 oct. 2004 à 09:16
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.
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
5 oct. 2004 à 21:26
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
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
5 oct. 2004 à 20:47
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
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
3 oct. 2004 à 23:14
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++
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
3 oct. 2004 à 18:53
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
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
3 oct. 2004 à 16:57
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.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 oct. 2004 à 16:50
Je trouve ta réponse contradictoire: si c'est "un chouia plus lent", ce n'est pas équivalent, surtout que le chouia se multiplie.
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
3 oct. 2004 à 16:42
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.

@+
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 oct. 2004 à 16:27
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?
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
3 oct. 2004 à 15:16
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.
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 oct. 2004 à 14:58
"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..

++
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
3 oct. 2004 à 14:48
"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
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
3 oct. 2004 à 13:21
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
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
3 oct. 2004 à 13: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
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
3 oct. 2004 à 12:01
AlexMan> Oui en effet l'exemple est plutot mal choisi.

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

Shell
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
3 oct. 2004 à 11:37
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+
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 oct. 2004 à 11:36
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..

++
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 oct. 2004 à 11:35
Ah mais je vois lintéret des pointeurs, mais ds l'exemple donné, il ny en avait pas, c tt ske je voulais dire.
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
3 oct. 2004 à 11:34
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
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
3 oct. 2004 à 11:21
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
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
3 oct. 2004 à 10:40
ok je le change, merci du conseil :)
Alp
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
3 oct. 2004 à 10:39
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+
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 oct. 2004 à 10:37
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

++
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 oct. 2004 à 10:34
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..

++
Alpacha Messages postés 95 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 20 mars 2006
3 oct. 2004 à 10:21
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
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 oct. 2004 à 10:16
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

++
Rejoignez-nous