Considérations sur les pointeurs de fonctions
Bonjour,
D'après ce que j'ai compris, on peut considérer une fonction comme une variable qui possède sa propre adresse mémoire, puisque chaque morceaux de code occupe une place mémoire. J'ai voulu comprendre comment traiter les pointeurs sur les fonctions en s'appuyant sur les pointeurs sur variables. en fait, une fonction serait plus une référence, puisque f et &f ont la même adresse mémoire.
(Je n'ai pas vu cela dans les livres que j'ai lui, mais je trouve que c'est clair comme ca)
De la même manière que l'on déclare une variable
on déclare une fonction comme ceci par exemple:
Supposons qu'on ait une fonction:
Code:
1 2 3
|
int f(int o){
return o+1;} |
Maintenant, on peut faire passer cette fonction "par valeur" comme n'importe quelle variable. On peut considérer que la fonction suivante est une composition de fonction f°g(x), où x est l'entier r.
Code:
1 2 3 4 5
| int main(){
int f1(int ft(int),int r){
int ff=ft(r);
return ff+10;
} |
Mais on peut aussi faire ceci:
Code:
1 2 3 4 5
|
int f2(int ft(int o),int r){
int ff=ft(r);
return ff+20;
} |
Quelle est d'ailleurs la différence avec le code précédent?
Comme les variables, on peut faire passer les fonctions par références:
Code:
1 2 3 4 5
|
int f3(int (&ft)(int o),int r){
int ff=ft(r);
return ff+30;
} |
et on aura:
Code:
1 2 3 4
|
int main(){
int o3=f3(f,2);
} |
Même question: quelle est la différence avec les cas précédents? Parce qu'ici, on ne cherche pas a modifier la fonction
Enfin, comme pour les variables, on a les pointeurs sur fonctions, avec un code spécifique:
Code:
int (*fct)(int c)=&f;
Donc fct est un pointeur sur la fonction f. Pour l'utiliser, on la déférence comme cela:
Code:
1 2 3 4 5
|
int f4(int (*ft)(int o),int r){
int ff=(*ft)(r);
return ff+40;
} |
et on l'utilise comme cela:
où comme cela:
Code:
1 2 3
|
int (*g)(int)=&f;
o=(&f)(5); |
Je voudrais savoir s'il est possible de faire qqch comme cela:
Code:
1 2 3 4 5 6
|
int g(int)=f;
//ou
int g(int)=f(int); |
parce qu'apparement ca fait planter le compilateur, g ne peut pas être initialisé.
D'après ce que j'ai vu, un pointeur sur fonction permet d'aller plus vite et d'économiser de la place mémoire, puisqu'on ne recrée pas de variables. Cela permet aussi de créer des "variables de fonctions" que l'on peut réutiliser dans le code.
Merci
Edit:
Bien sur, tout cela n'est que pur spéculation, j'attends vos corrections, commentaires, ajouts... avec remerciements de ma part.