Je viens de commencer le cours sur le langage C. Je suis arrivé à la partie sur les pointeurs et la programmation modulaire.
J'ai quelques soucis de compréhension sur les pointeurs. Voici mon programme, du moins, le fichier où mes fonctions sont développées :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "pointeur.h"
// INITIALISATION DES DONNES -----------------------------------------------------------
void initialisation_donnees(void)
{
int difficulte = 0 ; // je déclare une valeur de base à ma variable
int *pt_difficulte = &difficulte ; // je déclare un pointeur qui prend en valeur l'adresse de la variable "difficulté"
printf("\n------------\nAdresse de la variable difficulte : %p\n", &difficulte); // j'affiche l'adresse de "difficulté"
printf("Valeur du pointeur : %d\n------------\n\n", *pt_difficulte); // j'affiche la valeur qui est pointée par le pointeur, c'est bien la valeur de "difficulté"
}
// MENU DIFFICULTE ---------------------------------------------------------------------
void afficher_menu_difficulte()
{
printf("Choisir difficulte :\nEntre 1 et 100.\nEntre 1 et 200.\nEntre 1 et 300.\n");
}
// SAISIR DIFFICULTE -------------------------------------------------------------------
int saisir_difficulte(int *pt_difficulte, int difficulte)
{
printf("Saisir votre difficulte :"); // je demande à l'utilisateur d'entrer une difficulté
scanf("%d", &difficulte); // la difficulté choisie est envoyée à l'adresse de "difficultée"
printf("\nValeur de la variable que cible le pointeur : %d\n", *pt_difficulte); // il affiche une adresse à la place de la valeur de difficulté
printf("Valeur de la variable : %d\n", difficulte); // il affiche bien la valeur saisie
printf("Valeur du pointeur : %p\n", pt_difficulte); // la valeur du pointeur n'est pas la même que l'adresse de ma variable
printf("Adresse de la variable : %p\n", &difficulte); //
}
-> Alors, le soucis c'est que je ne comprends pas (à moitié en fait), pourquoi mon pointeur ne prend pas la valeur de la difficulté saisie.
Le soucis c'est que je n'arrive pas à envoyer en paramètres à la fonction "saisir_difficulte", le pointeur et l'adresse de la variable que j'ai déclaré dans la fonction "initialisation-donnees". Mais quand j'essaye de lui envoyer en mettant :
int saisir_difficulte(&difficulte, *pt_difficulte)
{
blabla...
}
ça ne fonctionne pas...
En gros, quand mon programme arrive à :
int saisir_difficulte(int *pt_difficulte, int difficulte)
Il recréé de nouvelles variables qui sont différentes de celles que j'ai déclaré dans la fonction "initialisation_donnes".
J'ai compris le problème mais j'ai pas la solution... Comment je peux envoyer la variable et le pointeur de la première fonction, à la seconde ?
Il faut bien comprendre que lorsque tu envoies des arguments à une fonction, celle-ci reçoit des copies.
Lorsque tu entres dans ta fonction saisir_difficulté(), la variable "difficulte" est une AUTRE variable que celle de la fonction appelante et par conséquent, se trouve à une autre adresse que celle pointée par pt_difficulté.
pt_difficulté contient l'adresse de la variable affectée, donc l'adresse de la variable "difficulte" appartenant à la fonction initialisation_donnee()
Ensuite, il n'y a vraiment aucun intérêt à envoyer un pointeur sur une variable ET la variable pointée, mais supposons que ce soit pour l'exercice.
D'accord, j'avais pas bien saisi cette notion. En fait, je peux avoir autant de variable "difficulte" que j'ai de fonctions dans mon programme mais pour autant elles seront toutes différentes (valeur et adresse) ?
Pour déclarer une variable et un pointeur qui peuvent être utilisés dans toutes les fonctions de mon programme, je doit les déclarer dans ma fonction main() et ensuite les envoyer en paramètres aux différentes fonctions que j'utilise ?
Merci !
NB: oui, je bidouille pour essayer de comprendre...
------------------------------
Salut @BamAss,
J'ai bien un appel de cette fonction dans ma fonction main(), elle se trouve juste dans un autre fichier.c :
Tout à fait, je peux avoir 25 fonctions qui contiennent une variable "toto", ce sont 25 variables différentes exclusivement locales aux fonctions.
Il faut partir du fait qu'une fonction n'a AUCUN moyen d'avoir connaissance de ce qui se passe en dehors* et ne peut manipuler que les variables qui lui sont connues, variables exclusivement locales*. D'où l'intérêt des pointeurs si on veut que cette fonction agisse sur des variables extérieures.
lorsque l'on écrit :
int maFonction(int toto)
{
...
}
cela revient à déclarer toto de la même manière que si on avait :
int maFonction()
{
int toto = argument envoyé à l'appel de cette fonction;
...
}
Il y a juste au niveau de l'envoi des paramètres aux fonctions où j'ai du mal. Par exemple dans ce programme si :
#include <stdio.h>
int multiplier_variable_locale(int * pointeursur_variable_locale, int * pointeursur_multiplicateur);
int main (void)
{
int fonction (){
int variable_locale = 40;
int multiplicateur = 0;
int resultat = 0;
printf("Multiplier la variable locale par x =\n");
scanf("%d", &multiplicateur);
multiplier_variable_locale(&variable_locale, &multiplicateur);
printf("Resultat = %d", resultat);
}
int multiplier_variable_locale(&variable_locale, &multiplicateur)
{
resultat = *pointeursur_variable_locale * *pointeursur_multiplicateur ;
}
return 0;
}
La console me ressort :
point.c: In function 'main':
point.c:21:32: error: expected declaration specifiers or '...' before '&' token
21 | int multiplier_variable_locale(&variable_locale, &multiplicateur)
| ^
point.c:21:50: error: expected declaration specifiers or '...' before '&' token
21 | int multiplier_variable_locale(&variable_locale, &multiplicateur)
|
Alors que pourtant j'ai bien déclaré ces variables dans la fonction main et que je souhaite uniquement envoyer l'adresse de celles-ci à la fonction "multiplier_variable_locale" pour mes pointeurs...
J'avais oublié de déclarer un pointeur et j'avais oublié la petite ligne du cours qui dit que lorsque l'on déclare plusieurs pointeurs sur une même ligne on DOIT mettre l'étoile OBLIGATOIREMENT avant le nom du pointeur.
Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e
[Débutant] Soucis avec les pointeurs
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.
Nobody Is Anonyme!!!
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.