ProgHelp

Une communauté intelligente et active

Les pointeurs en C (débutant)

Message par anasse82 » 31 Décembre 2013, 20:11

bonjour,
alors voila aujourd'hui je vais vous parler des pointeurs ;)
cependant que les choses soit claire je ne parlerai pas de pointeur sur fonction.
si ce sujet vous intéresse dieu crée internet l'homme inventa google :grin:

Alors on commence ? :grin:

HEEEE mais doucement c'est quoi un pointeur ?

Dsl j'oublié :/
donc un pointeur c'est un nouveau type de variable,
il a pour but de modifier la valeur d'une autre variable à distance (Non c'est pas du WIFI ou du Bluetooth).
Qui dit pointeur dit adresse ...
Et oui chaque variable comporte une adresse en C
n'importe la quelle sans exception.

Comment récuperton l'adresse d'une variable ?

ben c'est simple on utilise le '&'.

voici un petit exemple :
int *x;
int y;

y = 12;
x = &y;


alors le code est simple j'ai tout simplement déclaré de 2 variable : un int qui a pour nom "y" et pour valeur 12. Mais aussi un pointeur sur int qui a pour nom "x" avec pour valeur l'adresse de "y".
j’espère que vous me suivez :hap:

Vous l'aurez compris un pointeur est caractérisé par '*'
Vous pouvez le déclarer soit de cette manière "int *x;" ou de celle-ci "int* x;" personnellement j'utilise la premier mais les deux marche ;)


Comment pouvons nous faire pour la modifié à distance ?
ben comme ceci je pense que l’exemple que le Code suivant vous le comprendrez tout seul ;)

int *x;
int y;

y = 12;
x = &y;
*x = 3;

essayé par vous même, vous verrai que y est = 3 :P

Ok c'est bien tout ça mais à quoi ça sert réellement ?

je vais vous posée un problème :
imaginons que l'on souhaite avoir une fonction qui retourne 2 valeur.

Ben on met deux return (variable)?

pas bête mais au premiers return la fonction s’arrête ...
Mais grâce au pointeur on peu modifié à distance je vous montre un exemple
void divise(int *a, int *b)
{
int num;

num = *a;
*a = *a/*b;
*b = num%*b;
}
int main(void)
{
int x;
int y;

x = 10
y = 21
divise(&x, &y);
}

Si vous avez compris le code x est maintenant égale à 0 (car 10 / 21 = 0 on prend pas les nombre à virgule)
et y = 10 ( car 10 % 21 = 10 on prend que le reste de la division)

voila si vous avez des améliorations à proposé merci de mon faire part ;)
Dernière édition par anasse82 le 02 Janvier 2014, 16:19, édité 4 fois.
anasse82
Petit nouveau
 
Messages : 9
Points d'honneur : 7 PH
Inscription : 31 Déc 2013

Message par Patak » 31 Décembre 2013, 20:17

Salut :grin:
Sympa !

Mais attention à l’orthographe :

alors voila aujourd'hui je vais vous parlé des pointeur


1ere phrase, 2 fautes :hap:
Perso, je demande toujours à un pote ou à mes parents de me relire :?

Et utilise la coloration syntaxique : http://proghelp.fr/annonces-f20/la-coloration-syntaxique-t159.html :ugeek:

Mais sinon, c'est sympa :)
Et une fois que tu auras amélioré le topic, tu auras 5 Points d'honneur :hap:
Image


Pour obtenir le Grade Donateur et m'aider à payer l'hébergement de ProgHelp,
Vous pouvez faire un petit don en bas de la page d'accueil, ce sera très apprécié 8-)
Avatar de l’utilisateur
Patak
Administrateur
 
Messages : 1141
Points d'honneur : -666 PH
Inscription : 30 Oct 2012

Message par MyHand » 31 Décembre 2013, 21:52

Les pointeurs sont le plus souvent utilisé pour manipuler des choses dans la mémoire. Sinon, ton tutoriel n'est pas complet, il manque des choses..

Ah, et aussi, tu dis que "chaque variable a une adresse en C"

=> Un module, par exemple, est aussi référencé par une adresse. Y'a pas que les variables...
Avatar de l’utilisateur
MyHand
Programmeur
 
Messages : 179
Points d'honneur : 50 PH
Inscription : 09 Jan 2013

Message par Patak » 31 Décembre 2013, 22:13

Il dit :

je ne parlerai pas de pointeur sur fonction.


Donc c'est normale qu'il ne le précise pas :hap:

Mais sinon, j'aime bien ton tuto :grin:

+5 Points d'honneur :)
Image


Pour obtenir le Grade Donateur et m'aider à payer l'hébergement de ProgHelp,
Vous pouvez faire un petit don en bas de la page d'accueil, ce sera très apprécié 8-)
Avatar de l’utilisateur
Patak
Administrateur
 
Messages : 1141
Points d'honneur : -666 PH
Inscription : 30 Oct 2012

Message par Nicogo » 01 Janvier 2014, 16:10

Joli tuto, ayant fait du C et C++ j'avais déjà tout compris et enregistré ;)

S'il y a un truc à redire, c'est juste certain terme à revoir.
Sinon c'est compréhensible pour un débutant. :mrgreen:
Image
Avatar de l’utilisateur
Nicogo
Administrateur
 
Messages : 458
Points d'honneur : -666 PH
Inscription : 30 Oct 2012

Message par Sehnsucht » 01 Janvier 2014, 17:28

Bon ben moi je vais faire mon chiant (qui a dit "comme d'hab" ? ah oui c'est moi :hap: ) mais je trouve ça moyen pour un tuto, pour une présentation/introduction encore ça serait pas trop mal mais pas un tuto.

Déjà les fautes (bon je sais je suis exigeant là dessus) mais à l'heure actuelle avec l'autocorrection et tout ce qui existe même sans être un champion d'orthographe il y a moyen d'en éviter une bonne partie.
Ensuite le dernier code donné tel quel ne compile pas (le vérifier aurait été un minimum) et une indentation correcte est un plus non négligeable ; ci-joint ma correction (Note: :shock: y'a pas C dans la listes des langages du forum juste C++, je sais que c'est quasiment la même chose mais :shock: )
void divise (int *a, int *b) {
int num;

num = *a;
*a = *a / *b; // ici bien séparer le / du * sinon /* est considéré comme début de commentaire multiligne
*b = num % *b; // ici pas de *num ; num est un entier pas un pointeur
}

#include <stdio.h> // ajout pour pouvoir afficher les valeurs finales

int main (void) {
int x, y; // petite modif pour gagner une ligne, pas important ça ;)

x = 10; // oubli du ;
y = 21; // idem

divise (&x, &y);

printf ("x=%d ; y=%d\n", x, y); // ajout pour pouvoir afficher les valeurs finales
}

Bon après je le trouve moyen cet exemple, le nom de la fonction reflète mal ce qu'elle fait et pas d'utilité concrète à cette fonction (un exemple parlant concret fonctionnera toujours mieux ;) )
J'aurais préféré une fonction faisant la division euclidienne (donc renvoyant le quotient ET le reste de la division) souvent appelée divrem (pour "divide with remainder")
void divrem (int dividend, int divisor, int *quotient, int *remainder) {
*quotient = dividend / divisor;
*remainder = dividend - divisor * *quotient;
}

#include <stdio.h>

int main (void) {
int x, y, q, r;

x = 21; // note: j'ai inversé les valeurs de x et de y pour avoir un quotient et un reste non nuls
y = 10;

divrem (x, y, &q, &r);

printf ("%d = %d * %d + %d", x, y, q, r);
}

Enfin ce qui m'a gêné le plus c'est au tout début quand il est écrit que le rôle d'un pointeur est de "modifier à distance" une autre variable ; ça c'est juste une conséquence de 2 choses (et sans l'une des 2 ça ne marche plus):
Un pointeur sert à stocker une adresse et c'est tout.
On peut déréférencer un pointeur pour obtenir la valeur de la variable pointée (c'est quand on fait *x pour récupérer le contenu de l'adresse stockée par x)
Sans possibilité de déréférencement on ne pourrait pas modifier à distance (et certes les pointeurs perdraient alors beaucoup de leur intérêt :) )

Je pourrais chipoter aussi sur la différence de sémantique entre int* x et int *x mais ça serait plus embrouiller les lecteurs pour pas grand chose :grin:

Sinon ça reste une bonne introduction ; mais faut faire attention aux imprécisions et penser à bien relire (l'orthographe comme le code).

Cordialement !
Censément, quelqu'un de sensé est censé s'exprimer sensément.

Image
Avatar de l’utilisateur
Sehnsucht
Membre VIP
 
Messages : 277
Points d'honneur : 210 PH
Inscription : 10 Fév 2013

Message par Patak » 01 Janvier 2014, 18:03

Woaw, Sehn fait du C :hap:

Déjà les fautes (bon je sais je suis exigeant là dessus) mais à l'heure actuelle avec l'autocorrection et tout ce qui existe même sans être un champion d'orthographe il y a moyen d'en éviter une bonne partie.


On est d'accord :)
Image


Pour obtenir le Grade Donateur et m'aider à payer l'hébergement de ProgHelp,
Vous pouvez faire un petit don en bas de la page d'accueil, ce sera très apprécié 8-)
Avatar de l’utilisateur
Patak
Administrateur
 
Messages : 1141
Points d'honneur : -666 PH
Inscription : 30 Oct 2012

Suivant

Retour vers C

cron
  • Qui est en ligne ?
  • Consulter les nouveaux messages
  • Consulter les messages sans réponse
  • Au total, il y a 1 utilisateur en ligne :: 0 inscrit, 0 invisible et 1 invité (basé sur le nombre d’utilisateurs actifs des 5 dernières minutes)
  • Le nombre maximum d’utilisateurs en ligne simultanément a été de 272 le 12 Mars 2015, 03:11
  • Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité