Bonjour,
Débutant en C , j'ai plusieurs incompréhensions au niveau des pointeurs et fonctions avec pointeurs en paramètre.
En parcourant la FAQ C, je suis tombé sur cette fonction unsigned dix_puissance_n(unsigned n);
J'ai mis mettre cette fonction dans un .h et un .c puis de la tester dans un fichier test.c
J'ai également refait la fonction avec un pointeur.
fct_maths.c
fct_maths.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <stdlib.h> #include <stdio.h> #include "fct_maths.h" unsigned ui_dix_puissance_n(unsigned n) { unsigned i, res = 1; for(i = 0; i < n; i++) res *= 10; return res; } void v_dix_puissance_n(unsigned *pn) { unsigned i, res = 1; for(i = 0; i <*pn; i++) res *= 10; printf("%d", res); } /* int addition(int c, int d) { return (c+d); } */ /* double arrondi(const double x, unsigned n) { unsigned N = dix_puissance_n(n); return floor(x * N + 0.5) / N; } */
test.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef _FCT_MATHS_H_ #define _FCT_MATHS_H_ #include <stdlib.h> #include <stdio.h> #include <math.h> unsigned ui_dix_puissance_n(unsigned n); void v_dix_puissance_n(unsigned *pn); //int addition(int c, int d); //double arrondi(const double x, unsigned n); #endif
Mais quelle différence entre une fonction qui ne renvoie rien et modifier la variable directement en mémoire et une fonction qui renvoie un int dont on affecte le résultat dans une variable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h> #include "fct_maths.h" int main(int argc, char *argv[]) { double a = 1; int b = ui_dix_puissance_n(a); printf("valeur de b\n%d\n", b); printf("\n__________\n\n"); int c = 1; int *pc = &c; printf("valeur de c\n"); v_dix_puissance_n(pc); return(0); }
Ce que j'ai compris c'est que en général, l'utilisation d'une fonction avec pointeur (donc void fonction(int *pn)) est plus rapide que l'affectation du résultat à une variable (int fonction(int n), du fait de la manipulation de la variable directement par son adresse mémoire.
Mes interrogations:
-Quelles sont tous les avantages d'utiliser une fonction avec pointeur plutôt que l'autre avec un type de retour ?
-J'ai tendance à penser que l'utilisation d'une variable pointeur rajoute une variable au programme, tandis que sans pointeur on s'affranchit d'une variable, dans mon test.c ce n'est pas vrai car j'utilise une variable b pour stocker le résultat de la fonction mais si on utilisait directement ce résultat pour d'autre traitement.
-Existe t il un moyen mémo-technique pour savoir quand utiliser *pointeur ou pointeur ou &pointeur ? surtout le &pointeur.
-Pourriez vous me corriger si j'ai faux :
si je fais :
int variable = 1;
int *pvariable = &variable;
*pvariable --> c'est une variable qui stocke l'adresse mémoire de la variable, une fois " *pointeur = &variable " fait; si je l'affiche c'est l'adresse mémoire que je verrai
pvariable --> c'est la valeur de la variable pointé, donc la valeur de 'variable', si je l'affiche c'est la valeur de 'variable' que je verrai
&variable --> si je l'affiche, j'affiche l'adresse mémoire de la référence donc l'adresse mémoire de &variable
désolé pour ce pavé mais j'ai du mal, même en lisant et relisant le concept des pointeurs.
merci à vous, bonne journée
Partager