Langage C: pointeurs, pointeurs sur fonctions
razuki
Messages postés
242
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Lors d'un entretien, j'ai eu un test en langage C et je n'ai pas su répondre aux questions suivantes :
1) Comment est stockée une variable déclarée static dans la mémoire ?
=> je sais juste que static sert à garder une variable en mémoire de manière permanante, cad que même en dehors du bloc de déclaration de la variable, celle-ci n'est pas détruite. Ce qui se passe au niveau plus bas, dans les détails ( mémoire, stack ... etc) je ne sais pas ce qui se passe.
2) Que fait cette instruction :
=> je sais que ptr est un pointeur sur une fonction qui renvoie un type void, En revanche le premier argument c'est du chinois pour moi ... plus précisément l'étoile que j'ai mis en gras
=> Je sais aussi que y a un call back mais c'est un peu flou pour moi car le nom de la fonction n'apparait pas ( dans le premier argument de la fonction pointée par ptr ).
Dans quel genre de situation on utilise ce genre d'expression ?
3)
d vaut combien ? ( et pourquoi ?)
Merci d'avance pour votre aide.
Lors d'un entretien, j'ai eu un test en langage C et je n'ai pas su répondre aux questions suivantes :
1) Comment est stockée une variable déclarée static dans la mémoire ?
=> je sais juste que static sert à garder une variable en mémoire de manière permanante, cad que même en dehors du bloc de déclaration de la variable, celle-ci n'est pas détruite. Ce qui se passe au niveau plus bas, dans les détails ( mémoire, stack ... etc) je ne sais pas ce qui se passe.
2) Que fait cette instruction :
void (*ptr)(int* (*)(int* tab[]), int**);
=> je sais que ptr est un pointeur sur une fonction qui renvoie un type void, En revanche le premier argument c'est du chinois pour moi ... plus précisément l'étoile que j'ai mis en gras
=> Je sais aussi que y a un call back mais c'est un peu flou pour moi car le nom de la fonction n'apparait pas ( dans le premier argument de la fonction pointée par ptr ).
Dans quel genre de situation on utilise ce genre d'expression ?
3)
void *ptr; int d = sizeof(ptr);
d vaut combien ? ( et pourquoi ?)
Merci d'avance pour votre aide.
A voir également:
- Langage C: pointeurs, pointeurs sur fonctions
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage visual basic - Télécharger - Langages
- Langage basic gratuit - Télécharger - Édition & Programmation
2 réponses
Salut
1) Une variable static comme tu le dis, n'est pas vraiment variable si tu veux, c'est une adresse dans la mémoire qu'on appelle le TAS, et se promene dans le programme avec seulement l'adresse ou on appelle plutot un pointeur sur une variable.
Si je connait l'adresse de cette variable j'ai pas besoin d'etre dans la fonction où elle a été créée, mais en connaissant l'adresse on peut savoir la valeur de la variable qui se trouve à cette adresse. Donc on alloue une adresse de méoire dans les cases de mémoire.
2) De meme ici comme les variable les foncions aussi elles on des adresses mémoires.
On définit les adresses des fcontions donc pointeur sur une fonction, ainsi on peux lancer n'importe quelle fontion de meme types d'argumetns et de retour biens sur.
C'est pratique pour une programme de dessin ou on choisit des outils, donc on change les adresse de la fontion à lancer et du coup le code ne change pas.
Callback c'est pour lancer cette fonction à une adresse.
3)Ici ce que tu demande c'est connaitre la taille en octets occupé par cette adresse sur la fonction.
sizeof permet de savoir la taillle en octet occupé par chaque type de variable.
Voilà
Pour la partie 2 j'ai pas trop précisé car l'affectation d'une fonction à une adresse se fait en deux etapes. Si tu veux plus, ya un topic sur siteduzero.
http://www.siteduzero.com/tutoriel-3-314203-les-pointeurs-sur-fonctions.html
J'espere de t'avoir aidé.
1) Une variable static comme tu le dis, n'est pas vraiment variable si tu veux, c'est une adresse dans la mémoire qu'on appelle le TAS, et se promene dans le programme avec seulement l'adresse ou on appelle plutot un pointeur sur une variable.
Si je connait l'adresse de cette variable j'ai pas besoin d'etre dans la fonction où elle a été créée, mais en connaissant l'adresse on peut savoir la valeur de la variable qui se trouve à cette adresse. Donc on alloue une adresse de méoire dans les cases de mémoire.
2) De meme ici comme les variable les foncions aussi elles on des adresses mémoires.
On définit les adresses des fcontions donc pointeur sur une fonction, ainsi on peux lancer n'importe quelle fontion de meme types d'argumetns et de retour biens sur.
C'est pratique pour une programme de dessin ou on choisit des outils, donc on change les adresse de la fontion à lancer et du coup le code ne change pas.
Callback c'est pour lancer cette fonction à une adresse.
3)Ici ce que tu demande c'est connaitre la taille en octets occupé par cette adresse sur la fonction.
sizeof permet de savoir la taillle en octet occupé par chaque type de variable.
Voilà
Pour la partie 2 j'ai pas trop précisé car l'affectation d'une fonction à une adresse se fait en deux etapes. Si tu veux plus, ya un topic sur siteduzero.
http://www.siteduzero.com/tutoriel-3-314203-les-pointeurs-sur-fonctions.html
J'espere de t'avoir aidé.
1/ dans le segment .bss si initialisé à 0 ou .data sinon
2/ il s'agit d'un pointeur sur fonction qui a pour argument un pointeur (sur une fonction avec pour argument un tableau de pointeur sur des entiers) et un double pointeur.
3/ le sizeof renvoie la taille en byte de la variable ou du type passé en paramètre.
Cdlt,
2/ il s'agit d'un pointeur sur fonction qui a pour argument un pointeur (sur une fonction avec pour argument un tableau de pointeur sur des entiers) et un double pointeur.
3/ le sizeof renvoie la taille en byte de la variable ou du type passé en paramètre.
Cdlt,
Sauf qu'un byte est un groupe de bits (souvent 8 mais pas forcement). La traduction la plus juste est multiplet. D'ailleurs, la norme ISO précise bien qu'un char occupe un byte d'au moins 8 bits. Sur google, tu trouveras de la doc à ce sujet.
Pour les variables statiques, ce n'est certainement pas dans le tas qui est réservé à l'allocation dynamique. Ces variables sont stockées dans les segments data ou bss selon leur initialisation.
Pour les variables statiques, ce n'est certainement pas dans le tas qui est réservé à l'allocation dynamique. Ces variables sont stockées dans les segments data ou bss selon leur initialisation.
BYTE bit octet l'important c'etais pas ça, mais j'avoue que je savais pas l'histoire de variabilité de bites,ça dépend du compilateur. Par rapport à DOC j'ai pas vraiment besoin de tout ça. Car la pratique definie mes propres documentation si tu vois ce que je veux dire. Il faut avoir son propre style de dire les choses pour avoir un avantage. Attention c mon avis et à ne pas discuter :D!
Il faut avoir son propre style de dire les choses pour avoir un avantage.
Certes, mais expliquer avec ses mots n'empêche pas de donner une réponse juste.
Car en répondant que sizeof renvoie la taille en octet c'est faux. Même si c'est ta façon de dire.
De même que dire l'allocation de variables statiques se passe dans le tas est faux.
Mais, l'important c'est que tu te comprennes et que tu saches ce que tu fais ^^.
Certes, mais expliquer avec ses mots n'empêche pas de donner une réponse juste.
Car en répondant que sizeof renvoie la taille en octet c'est faux. Même si c'est ta façon de dire.
De même que dire l'allocation de variables statiques se passe dans le tas est faux.
Mais, l'important c'est que tu te comprennes et que tu saches ce que tu fais ^^.
3/ sizeof n'est pas la taille en octet mais en byte.