Les pointeurs

cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008 - 12 mai 2006 à 19:41
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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).

15 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2006 à 19:57
Accès à une zone (adresse dans la) mémoire.

ciao...
BruNews, MVP VC++
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
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..

void ajoute_un(int * b)
{
(*b)++;
}
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
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 lorsqu’il s’agit de transmettre ,par exemple, un tableau à une fonction . S’ils n’existaient 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 l’adresse du premier élément, c’est à dire son pointeur , on gagne beaucoup en efficacité. C’est d’ailleurs ce que le compilateur réalise par défaut : si dans l’appel d’une fonction il trouve un argument de la forme tableau [ ] , c’est l’adresse 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 c’est aussi une particularité héritée du C que de pouvoir accéder aussi facilement en C++ au " contenant et au contenu ". C’est ainsi que dans le corps même d’une fonction, il peut être indispensable de manipuler des pointeurs plutôt que des variables lorsqu’on 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 qu’il existe toute une littérature et de tous les niveaux où l’on peut trouver toutes les explications et toutes les réponses souhaitées.


C’est 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, n’ayant 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 l’on pouvait tomber d’accord 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 ?


Avec l'espoir d'être entendu.


.
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
13 mai 2006 à 00:22
Les pointeurs sont particulièrement utiles lorsqu’il s’agit de transmettre ,par exemple, un tableau à une fonction . S’ils n’existaient 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..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
13 mai 2006 à 09:10
Passage d'un tableau de 100000 int par valeur : 400000 octets
Passage de ce même tableau par pointeur : 4 octets.

On se rend vite compte de la différence...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2006 à 10:02
Me semblait avoir écrit en bon français pourtant: "SI on n'a pas besoin de l'adresse ...."
en réponse à Guilou34 dans son 3eme paragraphe.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
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)

L'intéret des pointeurs est résumé ici : http://c-faq.com/ptrs/goodfor.html

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

// Ma participation à la saturation du net:
http://hylvenir.free.fr
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mai 2006 à 11:36
Trop vaste sujet pour être résumé ainsi.


void myfunc()
{
int *tab;
tab = (int*) malloc(12 * sizeof(int));
....
}


void myfunc()
{
int tab[12];
....
}


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.

ciao...
BruNews, MVP VC++
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
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";

L'allocation n'est qu'un des points mentionnés.

ex : int t[1000] = { .... }:

for ( int* tmp = &t[0]; tmp != &t[1000]; ++tmp ) {...}

Il n'y a pas d'allocation et pourtant on voit bien que t et tmp n'ont pas le même rôle.


// Ma participation à la saturation du net:
http://hylvenir.free.fr
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mai 2006 à 17:32
strictement identique pour la fonction qui reçoit l'adresse du tableau, que soit dans une syntaxe ou une autre.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous