ProgHelp

Une communauté intelligente et active

Les pointeurs en C (débutant)

Message par Sehnsucht » 01 Janvier 2014, 18:17

Patak a écrit :Woaw, Sehn fait du C :hap:

"Sehn" fait beaucoup de choses ;)
Censément, quelqu'un de sensé est censé s'exprimer sensément.

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

Message par anasse82 » 02 Janvier 2014, 16:14

MyHand a écrit :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...


Alors j'ai pas dit qu'il y a que les variables qui ont une adresse ...
j'ai juste dit que tout les variable en C on une adresse ce qui est 100 % vrai.
anasse82
Petit nouveau
 
Messages : 9
Points d'honneur : 7 PH
Inscription : 31 Déc 2013

Message par anasse82 » 02 Janvier 2014, 16:27

Sehnsucht a écrit :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 !


dsl j'avais pas fais gaffe ...
j'ai corrigé tout ça
anasse82
Petit nouveau
 
Messages : 9
Points d'honneur : 7 PH
Inscription : 31 Déc 2013

Précédent

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é