Maison >développement back-end >C++ >Pourquoi le déréférencement d'un pointeur de fonction en C n'exécute-t-il pas la fonction ?
Déréférencement de pointeur de fonction : percer le mystère
En programmation C, un pointeur de fonction est une variable qui stocke l'adresse d'une fonction. Cependant, contrairement aux variables normales, le déréférencement d'un pointeur de fonction se comporte de manière unique.
Pourquoi le déréférencement d'un pointeur de fonction ne produit-il pas le résultat attendu ? La clé réside dans la compréhension de la façon dont les valeurs de fonction fonctionnent dans des contextes de rvalue (où elles sont utilisées comme valeurs plutôt que comme emplacements). En C, les valeurs de fonction dans les contextes rvalue sont automatiquement converties en pointeurs vers leur valeur de fonction d'origine.
Lors du déréférencement de ce pointeur avec *, la valeur de fonction d'origine est récupérée. Cependant, cette valeur est immédiatement reconvertie en pointeur, créant une boucle infinie de conversions de pointeurs. Le code fourni dans la question illustre ce comportement :
#include <stdio.h> void hello() { printf("hello"); } int main(void) { (*****hello)(); }
Ce code appelle essentiellement la fonction hello cinq fois via une chaîne de déréférences de pointeurs de fonction. Cependant, ces déréférencements n’exécutent pas réellement la fonction ; ils récupèrent simplement le pointeur de fonction, qui est ensuite reconverti en pointeur. Le résultat final est une série de manipulations de pointeur, mais aucun appel de fonction réel.
Pour comprendre pourquoi cela se produit, envisagez une expérience similaire :
int x; // Regular variable int *px = &x; // Pointer to the variable *px = 5; // Modifying the variable through the pointer
Dans ce code, déréférencer le pointeur * px nous permet de modifier la valeur de la variable x. Cependant, dans le cas d'un pointeur de fonction, le déréférencement ne modifie pas la fonction elle-même, mais récupère plutôt son adresse.
Cette distinction existe car les fonctions sont immuables en C, c'est-à-dire qu'elles ne peuvent pas être modifiées. Ils ne peuvent être appelés ou transmis que comme pointeurs. Il n'est donc pas nécessaire de déréférencer un pointeur de fonction pour modifier son comportement.
En résumé, le déréférencement d'un pointeur de fonction n'exécute pas la fonction, mais récupère plutôt son adresse. Cette adresse est ensuite immédiatement reconvertie en pointeur, ce qui entraîne une boucle infinie de conversions de pointeurs. Ce comportement est une caractéristique unique des valeurs de fonction dans les contextes rvalue en C et est pratique pour travailler avec des pointeurs de fonction sans avoir à utiliser explicitement une esperluette (&) pour le référencement d'adresse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!