cs_darkwhite
Messages postés133Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention29 avril 2008
-
12 mai 2006 à 19:41
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
14 mai 2006 à 17:32
Salut a tous
je debute le C
et j'aimerais qu'on m'explique l'interet des pointeurs (clairement si possible).
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 12 mai 2006 à 23:05
Les pointeurs sont tres utiles, surtout lorsque tu as de grosses variables , tu veux faire une fonction qui recupere une valeur
que l'utilisateur tape pour ca il faut qu'il remplisse l'adresse de ta variable..
pour ne pas le citer scanf..
int b;
scanf("%d",&b);//ne pas oublier le & !
//c'est quand meme pratique
en gros c'est avoir acces à une variable en mode écriture de n'importe ou..
Guilou34
Messages postés142Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention29 janvier 20161 13 mai 2006 à 00:21
Salut à toutes et à tous.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Les pointeurs sont particulièrement utiles lorsquil sagit de transmettre ,par exemple, un tableau à une fonction . Sils nexistaient pas, il faudrait recopier tous ses éléments dans la pile au risque de saturer celle-ci avec en plus une perte de temps qui peut ne pas être négligeable.
En transférant ladresse du premier élément, cest à dire son pointeur , on gagne beaucoup en efficacité. Cest dailleurs ce que le compilateur réalise par défaut : si dans lappel dune fonction il trouve un argument de la forme tableau [ ] , cest ladresse du premier élément de tableau qui sera placé sur la pile. Bien entendu cela suppose que dans la définition de la fonction se trouve dans la liste des arguments et à la même place un paramètre de même type.
Mais cest aussi une particularité héritée du C que de pouvoir accéder aussi facilement en C++ au " contenant et au contenu ". Cest ainsi que dans le corps même dune fonction, il peut être indispensable de manipuler des pointeurs plutôt que des variables lorsquon doit travailler en temps réel par exemple.
Cela étant on peut se demander si ce forum est le meilleur endroit pour poser ce genre de questions alors quil existe toute une littérature et de tous les niveaux où lon peut trouver toutes les explications et toutes les réponses souhaitées.
Cest pourquoi je propose aux lecteurs de ce forum cette question : Quel est le meilleur tutorial du C++ pour celui ou celle, jeune ou moins jeune , qui, nayant pas accès ou ne pouvant suivre un cours public, souhaite néanmoins se familiariser avec ce langage ? Pour ma part je ne dispose que des ouvrages en anglais.
Pourquoi alors, si lon pouvait tomber daccord sur tel ou tel bouquin, ne pas ouvrir un Forum consacré aux questions bien ciblées du genre : page 24 je ne parviens pas à comprendre le sens de tel paragraphe dans tel ouvrage ?
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 13 mai 2006 à 00:22
Les pointeurs sont particulièrement utiles lorsquil sagit de transmettre ,par exemple, un tableau à une fonction . Sils nexistaient pas, il faudrait recopier tous ses éléments dans la pile au risque de saturer celle-ci avec en plus une perte de temps qui peut ne pas être négligeable.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
C'est aussi que tout n'est pas possible sans les pointeurs..
Vous n’avez pas trouvé la réponse que vous recherchez ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 mai 2006 à 00:27
pointeur (adresse) au lieu de variable (valeur directe), dépend seulement si ça convient au problème traité mais manipuler un pointeur ne donne aucune efficacité particulière, si on n'a pas besoin de l'adresse c'est au contraire contre productif.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 mai 2006 à 00:43
Désolé mais il y a méprise, je dois donc clarifier:
Quand je dis "en bon français", là c'est pour nightlord qui nous fait le compte des octets qui iraient sur la pile alors que valeur directe plutôt que pointeur (msg de 00:27:46) était en réponse de Guilou34 (msg de 00:21:02). J'avais fait un condensé pas forcément compréhensible.
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 14 mai 2006 à 01:52
Salut,
pour revenir sur l'argument de l'intéret des pointeurs pour les grands tableaux.
Essayer ça juste pour voir :
#include <stdio.h>
#include <stdlib.h>
void fct( int t[10000] ) { int i;
printf( "sizeof %d\n", sizeof( t ) ); // affiche 4 ou 8, ça sent le pointeur
for ( i = 0; i < 4; ++i ) t[i] *= 2;
}
int main(int argc, char *argv[])
{
int t[10000] = { 1, 2, 3, 4 };
int i = 0;
for ( i = 0; i < 4; ++i ) printf( "[%d]", t[i]); printf("\n" );
fct( t );
for ( i = 0; i < 4; ++i ) printf( "[%d]", t[i]); printf("\n" );
// le tableau est modifié ce qui laisse présentir un passage par adresse ou référence)
system("PAUSE");
return 0;
}
En gros, les tableaux ne semblent (sont?) pas copiés lors des appels de fonction
mais castés automatiquement en C sans que le programmeur n'ait à le faire.
Il n'y doit y avoir aucune différent entre
void fct( int t[10000] ) { int i; for ( i = 0; i < 4; ++i ) t[i] *= 2; }
et
void fct( int* t ) { int i; for ( i = 0; i < 4; ++i ) t[i] *= 2; }
(un spécialiste en ASM pourra confirmer en regardant le code)
<li>allocation de mémoire (tableaux)
</li><li>accès générique à des variables de même type
</li><li>(simuler) le passage par référence pour les fonctions ( le C passe tout par valeur)
</li><li><tt>malloc</tt>'é des structures quelconque (arbres et listes liées)
</li><li>parcourir un tableau (une chaîne par exemple)
</li><li>copier efficacement les tableaux et structures par référence (particulièrement pour les paramètres de fonctions)</li>Remarquer le dernier point m'intrigue puisqu'il ne semble pas être valable pour les tableaux (mais au moins pour les structures).
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 mai 2006 à 02:11
C'est très clair que
void fct( int t[10000] )
ou void fct( int* t )
le compilo met l'adresse du tableau en param et rien d'autre, ce n'est qu'une question de préférence d'écriture mais le code généré est strictement le même.
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 14 mai 2006 à 11:21
les tableaux et les pointeurs c'est la meme chose si ce n'est que le tableau à deja alloué de la memoire ...
le pointeur on peut le faire avec malloc...
On a bien un tableau de 12 int dans les 2 fonctions mais pas du tout pareil, la 1ere demande une alloc de 48 octets au gestionnaire mémoire alors que la seconde rien, un simple 'sub esp, 48' qui réserve les 48 octets sur la pile du thread.
Hylvenir
Messages postés364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 14 mai 2006 à 13:06
Gros sujet en effet.
hum, la différence entre void fct( int t[10] ); et void fct( int*t );
ça sera la vérification de type lors de la compilation, tu devrais avoir plus souvent des ennuis avec la première qu'avec la deuxième (qui prend n'importe quelle taille de tableau)
"les tableaux et les pointeurs c'est la meme chose si ce n'est que le tableau à deja alloué de la memoire ..."
oula... ça craint de lire ça. un tableau c'est un tableau et un pointeur c'est une variable.
Faudrait pas confondre : char * s "Bonjour"; et char s[] "Bonjour";
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 14 mai 2006 à 17:11
Excusez mon inculture mais quel est la difference entre void f(int t[]) & void f(int *t)
"les tableaux et les pointeurs c'est la meme chose si ce n'est que le tableau à deja alloué de la memoire ..."
Surement qu'au niveau gestion ce n'est pas la meme chose mais niveau utilisation c'est pareil...