#include <stdio.h>
#include <stdlib.h>
void ranger(int nb1, int nb2) {
int tmp = 0;
if (nb2 < nb1) {
tmp = nb1;
nb1 = nb2;
nb2 = tmp;
}
printf("nb1 = %d\n", &nb1);
printf("nb2 = %d", &nb2);
}
int main() {
int nb1 = 10;
int nb2 = 5;
ranger(nb1,nb2);
return 0;
}
Voici mon code le but du programme est que nous avons nb1 et nb2 qui sont des entiers donnés et on doit juste mettre le plus petit entier dans nb1 et le plus grand dans nb2, le problème c'est qu'il m'affiche ça.
pourrai-je avoir des mini détails de pourquoi je dois mettre le & et parfois pas ou même juste la différence parce que d'habitude ça marche dans mon main mais là non
Pour bien comprendre cela, il faut être arrivé aux pointeurs. Un pointeur est l'adresse en mémoire d'une variable, on peut voir ça comme un numéro de tiroir où est rangé le contenu de la variable.
int variable = 5 -> le programme stock la valeur 5 dans un tiroir étiqueté "variable" qui a un numéro quelconque.
Lorsque l'on met l'esperluette devant une variable, cela signifie : "l'adresse de".
Dans ce cas &valeur n'est pas maitrisable, c'est le programme qui choisi les adresses auxquelles il range les variables, tu peux donc simplement l'interroger. Quand tu écris &variable, la réponse est "le contenu de variable est rangé dans le tiroir 34772"
Le printf n'a besoin que de savoir quelle valeur il doit afficher, donc ce que contient variable, pas l'endroit où c'est rangé.
Pour bien piger l'intérêt des pointeurs, tu peux faire des recherches sur la portée des variables en C. Il faut comprendre que lorsqu'on envoie un argument à une fonction, cette dernière reçoit une copie, donc si elle modifie le contenu de la copie, l'original (dans la fonction appelante) ne sera pas modifiée. printf n'apporte pas de modification aux arguments qu'il reçoit, donc une copie fait l'affaire. Si tu envoies la valeur 5, il affiche 5 sans avoir à le transformer en 6, ce n'est pas ce qu'on lui demande.
Lorsque tu utilises &variable dans un scanf par exemple, je suppose que c'est ce à quoi tu fais allusion, la fonction va devoir modifier la valeur de la variable, donc on lui envoie l'adresse pour lui dire :"range le résultat dans le tiroir 34772".
Pour chipoter, un pointeur est UNE VARIABLE qui contient une adresse.
int toto; déclare une variable
& toto est une expression qui est une adresse d'entiers
int *ptr; est une variable, a qui on peut affecter &toto, c'est donc un pointeur.
C'est un des problèmes de l'enseignement de C à des débutants : on a besoin de la notion d'adresse très tôt, dès qu'on a besoin de faire lire des entiers, ce qui est un élément des exercices de base habituels (entrez deux nombres, afficher la somme).
Et les pointeurs apparaissent comme paramètres des fonctions que l'on déclare, et qui ont besoin de simuler un passage par référence. Exemple, pour échanger deux variables, on écrit une fonction qui reçoit leurs adresses, dans des paramètres qui sont des pointeurs.
Ca fait partie de la base pour commencer à programmer en C, mais ça n'oblige absolument pas, à ce stade, à se taper des considérations sur l'allocation dynamique et les structures chaînees. Ce qu'on appelle "faire les pointeurs".
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
Le Tout est souvent plus grand que la somme de ses parties.