Sérieusement j'ai feuilleté au moins 5 videos de 40 min chacune mais aucune n'a été aussi explicite que celle ci franchement chapeau pour la transmission du savoir aussi léger et merci pour les explications
Excellent ! C'est une masterclass pour moi. Je n'utilise que des language haut niveau en tant que dev web. Par curiosité, je voulais savoir ce qu'est un pointer. C'est tellement bien expliqué que je pense avoir compris du premier coup. Je comprends mieux ce que fait un garbage collector dans les langages haut niveau. Il va juste compter le nombre de référence qui sont encore sur la stack pour savoir s'il doit désallouer ou non la mémoire pointé par cette référence. Quand le compte est a zero, il libère automatiquement la mémoire. Comme les adresse/références sont sur la stack, le compte décrémente lorsque le pointeur qui contient l'adresse/référence sort du scope et donc quand sa mémoire est libéré.
Excellent cours. Faites attention quand vous dîtes que pb++ incrémente mon pointeur de un octet. C'est juste parce que derrière il y a des unsigned char. Mais c'est mieux de préciser que l'on incrémente de la taille d'un élément vers le quel on pointe. pb++ pour un int c'est un incrément de 4 octets. Ça peut prêter à confusion. Mais sinon c'est top l'approche.
Très bonnes explications. Quelles précisions : 1/ à 4:09 c'est à chaque appel de fonction que l'on empile un nouveau contexte (variables locales + registres du processeur). Une fonction qui appelle une fonction empilera donc un contexte. Un scope (code entre accolades) également. 2/ Il faut préciser que les variables globales ou les variables locales statiques vont sur le tas (une variable locale statique étant une variable globale scopée dans la fonction, en gros visible uniquement depuis cette fonction). 3/ La limite de la pile sur Linux est configurable (commande ulimit et chez moi vaut 8 Mo) mais sauf pour les systèmes embarqués ou les threads pas la peine de changer la taille : si on flirte dans sa limite, c'est signe d'une mauvaise programmation (variables locales trop grosses ou bien trop d'appels de fonctions). 4/ Sinon pour les int à 4 octets, c'est vrai pour les systèmes 32-bits et les systèmes 64-bits (compatibilité), les pointeurs sont sur 4 ou 8 octets selon l'archi. Du coup vaut mieux utiliser int32_t et int64_t il y a moins de risque de se tromper. 5/ Attention à la confusion : pb++ incrémente de 1 car il fait plus sizeof(unsigned char) qui vaut 1 par contre si c'était int* pb alors pb++ aurait augmenté de sizeof(int) soit 4 (fait un printf de "%p" pour afficher les adresses).
PS: une BD gratuitement téléchargable sur comment marche les ordinateurs et leur mémoire : site web "savoir sans frontière" puis "informagique" (avec un G) :D
Excellente approche sur les pointeurs. Le problème est que ceux qui développent en C maitrisent bien mais ceux qui regardent occasionnellement du C se font "des nœuds" dans la tête. Bref, il faudrait mettre en favori cette vidéo comme piqure de rappel. Merci
Très bonnes explications, moi personnellement un niveau de la syntax (*p) je le traduis comme "le contenu" c.a.d pour lire ou écrire "la zone de mémoire pointée". Peut être qu'une vidéo sur le passage de paramètre par référence pourrait être intéressante pour les débutants.
@@gauthierthomas1640 Chaque variable est accessible par son adresse dans le processus Si t'as une variable int a, &a renvoie l'adresse de a. En c++ on s'en sert principalement pour faire des "passages par réference" afin d'éviter de copier les variables en paramètres et de modifier en dépit de la scope. L'opérateur * permet de spécifier lors de la déclaration de la variable qu'il s'agit d'un pointeur. Un pointeur garde en mémoire l'adresse d'une variable de son type, on dit qu'il pointe vers cette valeur. on peut dire int* b = &a; Pour accéder à la valeur pointée par le pointeur, on écrit *b = 5, autrement tu modifies l'adresse à laquelle il pointe et non la valeur pointée. On évite d'avoir des pointeurs vides, il est possible d'allouer l'espace manuellement avec malloc/calloc/etc en C et l'opérateur 'new' en c++, cette méthode est obsolète premièrement car elle est risquée (memory leak) et car les pointeurs intélligents, les smart pointers existent.
L'explication est vraiment clair et propre. Pour moi il n'y a qu'un tout petit oubli, tu aurais également pu montrer qu'on peut modifier i avec *(&i) = 2; Après pour un cours vraiment complet sur le C, j'espère qu'il y aura un chapitre : Pointeurs sur fonctions (Même si je comprends qu'il ne fallait pas déjà trop charger ici 😅).
C'est une approche débutants ici. La syntaxe que tu proposes aurait embrouillé je pense d'autant plus qu'elle n'a pas d'utilisation dans le monde réel. Je vais orienter vers de la pratique pour avancer sur ces sujets car la théorie ne permet pas de se projeter.
@@gamecodeur Comme je souhaitais l'exprimer avec le "Pour moi" cela reste une appréciation très personnelle. Je n'avais pas pour but de remettre en cause ta pédagogie. Moi j'avais pas vu que ça pouvais embrouiller et ça tombe bien, c'est toi l'enseignant 😉
@@wizzrobert4730 Salut oui c'est souvent ça le problème avec les enseignants je l'ai mainte fois constaté malheureusement, c'est le "pour moi" qui est problématique, comme tu le dis "Moi j'avais pas vu que ça pouvais embrouiller" beaucoup de profs pour eu il pense que c'est facile à comprendre, ce qui leurs semblent évident pour eu ne l'est pas forcément pour leur élèves. et c'est pour ça qu'il y a un effondrement dans l'apprentissage à l'éducation national, comme eu (les prof) comprennent il pense que les autres comprendrons, c'est bien là le problème. David à une approche pédagogique. Attention ce n'est pas une critique envers toi Wizzrobert c'était juste pour dire.
@@hbx380 Je vois pas pourquoi je l'aurais mal pris. D'autant que ta remarque est pertinente. Moi je suis plutôt partisan d'une approche en mode quelques pré-requis sont parfois nécessaires. David lui a une approche différente et sa réponse à simplement été de me rappeler les fondamentaux de sa méthode. Après j'ai le droit de pas être d'accord mais la réalité c'est que c'est les 6 ans de GameCodeur, méthode qui donc a fait ses preuves. On est sur TH-cam et si je veux confronter ma vision des choses au monde j'ai qu'à proposer ma vidéo sur les pointeurs et quand on fêtera les 6 ans de WizzrobertCodeur on verra.
excellente vidéo, j'ai pu mieux comprendre les pointeurs, même si tout n'est pas encore gravé dans le marbre et clair comme de l'eau de roche, j'ai compris plusieurs choses qui me semblaient floues au par avant et ce même après avoir fait plusieurs cours. je vais revoir la vidéo encore je pense que ca va pas faire de mal ! Merci !
7:50 c'est effectivement sujet à confusion. Surtout que l'opérateur * sert par la suite à récupérer la valeur, et là c'est parfaitement logique de coller l'étoile au nom de la variable. Personnellement je déclare toujours mes pointeurs avec l'étoile collée au type, peu importe la convention.
Merci pour le partage. Concernant le code main.c à la ligne 11. Est-ce qu c'est vraiment l'adresse de p ou la valeur numérique de i (adresse de i) qu'on a affecté à p. Car l'adresse de p s'obtient avec &p? Merci d'avance de votre retour.
20:52 Au début de la vidéo tu dis qu'un pointeur à une taille de 4 octets, or tu as dans le pointeur p une adresse supérieur à $FFFF (65536). Donc sur un OS 32Bits un pointeur est composé de 4 octets et sur un OS 64bit un pointeur est composé de 8 octets.
Oui manque de concentration comme dit en réponse à un précédent commentaire. 256 combinaisons et pas de 0 a 256 d'autant plus que j'en fais la démonstration dans la même vidéo. Je ferai un patch dans la version de la vidéo inclue dans 'e cours officiel sur Gamecodeur.
Si je fais: int a; int b; a = 1; b = a; La finalité c'est la même chose non ? (Outre le fait qu'on peut passer d'une référence de variable à une autre)
Merci pour l'explication David. Cependant, je reste sur ma faim avec ce concept. Nul part je n'ai trouvé quelqu'un qui explique le pourquoi du comment du pointeur 😁. Se déplacer d'un octet, ect... très bien. J'ai pigé. Mais pourquoi ? A quoi ça sert de faire ça. Le pointeur ressemble a une variable mais en plus complexe mais je n'arrive pas à saisir l'intérêt d'utiliser un pointeur. Quand on a utilisé que des langages de haut niveau, c'est très difficile d'assimiler qu'un pointeur c'est seulement une variable car du coup on se dit : "Bha ok c'est une sorte de variable mais c'est chiant à utiliser alors à quoi bon ?" Tu vois où je veux en venir ? Pour moi cette explication n'est jamais donnée.
Un pointeur permet d'accéder à un espace mémoire à partir d'une adresse (donc on se balade avec l'adresse dans une variable, ce qui est pratique). C'est quasi indispensable pour les données complexes comme les structs. En C, c'est le seul moyen de gérer des chaînes de caractères (une chaîne de caractère est alors représentée par un pointeur vers son 1er caractère). Un pointeur permet de passer, à une fonction, l'adresse d'une variable ce qui permet à la fonction de modifier la valeur (vu qu'on a son adresse, on peut aller y écrire ce qu'on veut), ce qui n'aurait pas été possible autrement. C'est une des principales utilisation des pointeurs.
Peux-tu expliquer la simulation d’objets ou l’utilisation d’objets par une rigueur de code utilisant les pointeurs d’adresses, je suis tombé sur des explications sur internet mais ce n’était pas clair… merci 🙏
Ta question n'est pas claire du tout : que veux-tu dire par objets ? Des instances de classes comme pour le C++ ? Que veux-tu dire par simulation et par rigueur ? Je pense que tu veux parler de comment faire de l'héritage de classe en pur C ? Je fais du C depuis 2001, les seuls endroits où j'ai vu ça c'est en GTK+ et du vieux code Android natif donc si tu peux éviter cela, évite et utilises directement du C++. Sinon pour répondre à ta question, penses que l'héritage n'est qu'une concaténation de structures contiguë en mémoire : = + . Où spécialisation veut dire "les nouveaux champs que tu ajoutes". Ton pointeur contient l’adresse du début de la classe mère même s'il doit référer sur la classe fille. En C tu peux faire des casts pour changer de type. Quand tu modifies le typage, tu modifies l'INFORMATION sur nombre d'octets contigus ATTENDUS par le compilateur, ainsi tu peux accéder ou cacher les champs au développeur. Maintenant tu peux ajouter en début de structure cette information supplémentaire de type. Mais il vaut bien mieux coder directement en C++ car la syntaxe sera plus propre et le compilateur va faire des vérifications sur le type pendant la compilation.
unsigned char *pb=buffer, ici tu as changé le contenu du pb , pas pb non? quand tu ecrits pb=buffer ==> pb a l'adresse du buffer , mais quand tu ecrits *pb=buffer, c'est a dire la valeur du pb = l'adresse de buffer, corrige moi svp
Je suis le seul à mal comprendre? Quand vous expliquez le Stack, vous parlez des variables locales. Mais le stack n'est pas utilisé pour gérer les variables locales, mais uniquement pour le passage de paramètres.
Ben si... En C, quand on déclare localement une variable, elle se met sur la pile (stack). De cette manière, elles sont dépilées (et détruites donc) à la sortie du bloc.
Les recommandations sont de les déclarer le plus localement possible, au moment de leur première utilisation, et si possible dans le bloc les utilisant. Ce sont pour moi, parfois, des considérations quasi religieuses pour certains. Je reste pragmatique et souple, l'idée est de faire du mieux possible sâchant que la perfection n'est pas de ce monde. A noter que dans mon exemple, je ne déclare pas de variables en entête, sauf celle que j'utilise en 1er bien sûr. Donc je ne comprends pas la remarque de "Le Comédien".
@@gamecodeur Non ce n'est pas de la religion, c'est important quand on développe un gros logiciel comme un jeu de réduire au maximum la charge cognitive du relecteur. Il faut éviter de déclarer une variable et ensuite de lui assigner une valeur quelques lignes après. Il faut autant que possible assigner la valeur de variable la ligne où on la déclare et const la valeur si possible. Oublier l'assignement peut mener à des UB très chiants à debugguer.
Cela depend du compilateur, par exemple celui du DDK(pour écrire un driver) de microsoft sortira une erreur de compilation si déclaration des variables n'est pas faite au début du code de la fonction.
je suis étudiant en l1 informatique et j'ai compris les pointeurs à partir du moment ou j'ai compris qu'un pointeur n'était ni plus n'i moins qu'une variable qui renseigne une adresse (d'une autre variable par exemple)
Sérieusement j'ai feuilleté au moins 5 videos de 40 min chacune mais aucune n'a été aussi explicite que celle ci franchement chapeau pour la transmission du savoir aussi léger et merci pour les explications
Excellent ! C'est une masterclass pour moi. Je n'utilise que des language haut niveau en tant que dev web. Par curiosité, je voulais savoir ce qu'est un pointer. C'est tellement bien expliqué que je pense avoir compris du premier coup. Je comprends mieux ce que fait un garbage collector dans les langages haut niveau. Il va juste compter le nombre de référence qui sont encore sur la stack pour savoir s'il doit désallouer ou non la mémoire pointé par cette référence. Quand le compte est a zero, il libère automatiquement la mémoire. Comme les adresse/références sont sur la stack, le compte décrémente lorsque le pointeur qui contient l'adresse/référence sort du scope et donc quand sa mémoire est libéré.
C'est exactement ça !
Excellent cours. Faites attention quand vous dîtes que pb++ incrémente mon pointeur de un octet. C'est juste parce que derrière il y a des unsigned char. Mais c'est mieux de préciser que l'on incrémente de la taille d'un élément vers le quel on pointe. pb++ pour un int c'est un incrément de 4 octets. Ça peut prêter à confusion. Mais sinon c'est top l'approche.
je me posais justement la question, merci de la précision :-)
Très bonnes explications. Quelles précisions : 1/ à 4:09 c'est à chaque appel de fonction que l'on empile un nouveau contexte (variables locales + registres du processeur). Une fonction qui appelle une fonction empilera donc un contexte. Un scope (code entre accolades) également. 2/ Il faut préciser que les variables globales ou les variables locales statiques vont sur le tas (une variable locale statique étant une variable globale scopée dans la fonction, en gros visible uniquement depuis cette fonction). 3/ La limite de la pile sur Linux est configurable (commande ulimit et chez moi vaut 8 Mo) mais sauf pour les systèmes embarqués ou les threads pas la peine de changer la taille : si on flirte dans sa limite, c'est signe d'une mauvaise programmation (variables locales trop grosses ou bien trop d'appels de fonctions). 4/ Sinon pour les int à 4 octets, c'est vrai pour les systèmes 32-bits et les systèmes 64-bits (compatibilité), les pointeurs sont sur 4 ou 8 octets selon l'archi. Du coup vaut mieux utiliser int32_t et int64_t il y a moins de risque de se tromper. 5/ Attention à la confusion : pb++ incrémente de 1 car il fait plus sizeof(unsigned char) qui vaut 1 par contre si c'était int* pb alors pb++ aurait augmenté de sizeof(int) soit 4 (fait un printf de "%p" pour afficher les adresses).
PS: une BD gratuitement téléchargable sur comment marche les ordinateurs et leur mémoire : site web "savoir sans frontière" puis "informagique" (avec un G) :D
Merci pour les précisions
Excellente approche sur les pointeurs. Le problème est que ceux qui développent en C maitrisent bien mais ceux qui regardent occasionnellement du C se font "des nœuds" dans la tête. Bref, il faudrait mettre en favori cette vidéo comme piqure de rappel. Merci
Très bonnes explications, moi personnellement un niveau de la syntax (*p) je le traduis comme "le contenu" c.a.d pour lire ou écrire "la zone de mémoire pointée". Peut être qu'une vidéo sur le passage de paramètre par référence pourrait être intéressante pour les débutants.
Oui je couvrirai ça ainsi que les pointeurs sur fonctions dans le parcours complet
Je pense être incollable sur les pointeurs mais j'ai trouvé ça captivant, ça fait du bien de voir une approche différente
si t'es incollable expliques moi stp
@@gauthierthomas1640 Chaque variable est accessible par son adresse dans le processus
Si t'as une variable int a, &a renvoie l'adresse de a. En c++ on s'en sert principalement pour faire des "passages par réference" afin d'éviter de copier les variables en paramètres et de modifier en dépit de la scope.
L'opérateur * permet de spécifier lors de la déclaration de la variable qu'il s'agit d'un pointeur.
Un pointeur garde en mémoire l'adresse d'une variable de son type, on dit qu'il pointe vers cette valeur.
on peut dire int* b = &a;
Pour accéder à la valeur pointée par le pointeur, on écrit *b = 5, autrement tu modifies l'adresse à laquelle il pointe et non la valeur pointée.
On évite d'avoir des pointeurs vides, il est possible d'allouer l'espace manuellement avec malloc/calloc/etc en C et l'opérateur 'new' en c++, cette méthode est obsolète premièrement car elle est risquée (memory leak) et car les pointeurs intélligents, les smart pointers existent.
Bonjour. Belle explication...
Pouvez-vous svp utiliser les pointeurs pour faire les algorithmes de tri ?
L'explication est vraiment clair et propre.
Pour moi il n'y a qu'un tout petit oubli, tu aurais également pu montrer qu'on peut modifier i avec *(&i) = 2;
Après pour un cours vraiment complet sur le C, j'espère qu'il y aura un chapitre : Pointeurs sur fonctions (Même si je comprends qu'il ne fallait pas déjà trop charger ici 😅).
C'est une approche débutants ici. La syntaxe que tu proposes aurait embrouillé je pense d'autant plus qu'elle n'a pas d'utilisation dans le monde réel. Je vais orienter vers de la pratique pour avancer sur ces sujets car la théorie ne permet pas de se projeter.
@@gamecodeur Comme je souhaitais l'exprimer avec le "Pour moi" cela reste une appréciation très personnelle. Je n'avais pas pour but de remettre en cause ta pédagogie. Moi j'avais pas vu que ça pouvais embrouiller et ça tombe bien, c'est toi l'enseignant 😉
@@wizzrobert4730 Salut oui c'est souvent ça le problème avec les enseignants je l'ai mainte fois constaté malheureusement, c'est le "pour moi" qui est problématique, comme tu le dis "Moi j'avais pas vu que ça pouvais embrouiller" beaucoup de profs pour eu il pense que c'est facile à comprendre, ce qui leurs semblent évident pour eu ne l'est pas forcément pour leur élèves. et c'est pour ça qu'il y a un effondrement dans l'apprentissage à l'éducation national, comme eu (les prof) comprennent il pense que les autres comprendrons, c'est bien là le problème. David à une approche pédagogique.
Attention ce n'est pas une critique envers toi Wizzrobert c'était juste pour dire.
@@hbx380 Je vois pas pourquoi je l'aurais mal pris. D'autant que ta remarque est pertinente.
Moi je suis plutôt partisan d'une approche en mode quelques pré-requis sont parfois nécessaires. David lui a une approche différente et sa réponse à simplement été de me rappeler les fondamentaux de sa méthode.
Après j'ai le droit de pas être d'accord mais la réalité c'est que c'est les 6 ans de GameCodeur, méthode qui donc a fait ses preuves. On est sur TH-cam et si je veux confronter ma vision des choses au monde j'ai qu'à proposer ma vidéo sur les pointeurs et quand on fêtera les 6 ans de WizzrobertCodeur on verra.
excellente vidéo, j'ai pu mieux comprendre les pointeurs, même si tout n'est pas encore gravé dans le marbre et clair comme de l'eau de roche, j'ai compris plusieurs choses qui me semblaient floues au par avant et ce même après avoir fait plusieurs cours.
je vais revoir la vidéo encore je pense que ca va pas faire de mal !
Merci !
Salut. Sympa ce petit bout de code sur les pointeurs en C :)
Merci super clair en plus j'ai vu certaine notions inconnues ^^
Salut David, Petite fourlache au niveau des valeurs possibles pour un octet.... les valeurs s'étendent de 0 à 255 soit 256 valeurs ;-)
Tu as raison j'ai fourché
@@gamecodeur comme quoi...
ca arrive même au meilleur ;-)
putain donner a cette homme le prix nobel du meilleur prof de tout les temps👋👋👋👋👋👋👋👋
Mais que c'est excellent! Merci! : D
7:50 c'est effectivement sujet à confusion. Surtout que l'opérateur * sert par la suite à récupérer la valeur, et là c'est parfaitement logique de coller l'étoile au nom de la variable.
Personnellement je déclare toujours mes pointeurs avec l'étoile collée au type, peu importe la convention.
Merci pour le partage.
Concernant le code main.c à la ligne 11. Est-ce qu c'est vraiment l'adresse de p ou la valeur numérique de i (adresse de i) qu'on a affecté à p. Car l'adresse de p s'obtient avec &p?
Merci d'avance de votre retour.
Merci pour cette vidéo. Que pensez-vous du langage Rust ? l'avez vous deja utilisé dans le domaine du jeux video ?
Ça compile en natif et en web assembly donc ça a l'air top. Mais je ne connais pas plus que ça.
20:52 Au début de la vidéo tu dis qu'un pointeur à une taille de 4 octets, or tu as dans le pointeur p une adresse supérieur à $FFFF (65536). Donc sur un OS 32Bits un pointeur est composé de 4 octets et sur un OS 64bit un pointeur est composé de 8 octets.
Petite erreur d'inattention: un octet ca va de 0 à 255, pas 256 ;)
Oui manque de concentration comme dit en réponse à un précédent commentaire. 256 combinaisons et pas de 0 a 256 d'autant plus que j'en fais la démonstration dans la même vidéo. Je ferai un patch dans la version de la vidéo inclue dans 'e cours officiel sur Gamecodeur.
dans quel cas ca sert a quelque chose de changer la valeur d'une variable via un pointeur?
Tu passes le pointeur a une fonction du coup elle devient capable de changer la valeur de la variable
Si je fais:
int a;
int b;
a = 1;
b = a;
La finalité c'est la même chose non ? (Outre le fait qu'on peut passer d'une référence de variable à une autre)
Non, là tu fais une copie de valeur. Les pointeur permettent de travailler sur la référence vers la valeur, donc une seule valeur en mémoire.
oh la la vais devoir la regarder plusieurs fois parce que ça fait mal au crâne
Genials merci vrm
Merci pour l'explication David. Cependant, je reste sur ma faim avec ce concept. Nul part je n'ai trouvé quelqu'un qui explique le pourquoi du comment du pointeur 😁. Se déplacer d'un octet, ect... très bien. J'ai pigé. Mais pourquoi ? A quoi ça sert de faire ça. Le pointeur ressemble a une variable mais en plus complexe mais je n'arrive pas à saisir l'intérêt d'utiliser un pointeur. Quand on a utilisé que des langages de haut niveau, c'est très difficile d'assimiler qu'un pointeur c'est seulement une variable car du coup on se dit : "Bha ok c'est une sorte de variable mais c'est chiant à utiliser alors à quoi bon ?" Tu vois où je veux en venir ? Pour moi cette explication n'est jamais donnée.
Un pointeur permet d'accéder à un espace mémoire à partir d'une adresse (donc on se balade avec l'adresse dans une variable, ce qui est pratique). C'est quasi indispensable pour les données complexes comme les structs.
En C, c'est le seul moyen de gérer des chaînes de caractères (une chaîne de caractère est alors représentée par un pointeur vers son 1er caractère).
Un pointeur permet de passer, à une fonction, l'adresse d'une variable ce qui permet à la fonction de modifier la valeur (vu qu'on a son adresse, on peut aller y écrire ce qu'on veut), ce qui n'aurait pas été possible autrement. C'est une des principales utilisation des pointeurs.
A mon humble avis, ça manque un peu de détails. notamment sur comment remplir la zone mémoire pointée par ton buffer.
L'idée était une capsule pour le concept de pointeur uniquement, un cours sur la gestion dynamique de la mémoire est prévu.
C'est clair en tout cas
11:20 je pense que dire que "l'adresse de p c'est l'adresse de i" est faux. Je dirais plutôt que : "le pointeur p contient l'adresse de la variable i"
Peux-tu expliquer la simulation d’objets ou l’utilisation d’objets par une rigueur de code utilisant les pointeurs d’adresses, je suis tombé sur des explications sur internet mais ce n’était pas clair… merci 🙏
Ta question n'est pas claire du tout : que veux-tu dire par objets ? Des instances de classes comme pour le C++ ? Que veux-tu dire par simulation et par rigueur ? Je pense que tu veux parler de comment faire de l'héritage de classe en pur C ? Je fais du C depuis 2001, les seuls endroits où j'ai vu ça c'est en GTK+ et du vieux code Android natif donc si tu peux éviter cela, évite et utilises directement du C++. Sinon pour répondre à ta question, penses que l'héritage n'est qu'une concaténation de structures contiguë en mémoire : = + . Où spécialisation veut dire "les nouveaux champs que tu ajoutes". Ton pointeur contient l’adresse du début de la classe mère même s'il doit référer sur la classe fille. En C tu peux faire des casts pour changer de type. Quand tu modifies le typage, tu modifies l'INFORMATION sur nombre d'octets contigus ATTENDUS par le compilateur, ainsi tu peux accéder ou cacher les champs au développeur. Maintenant tu peux ajouter en début de structure cette information supplémentaire de type. Mais il vaut bien mieux coder directement en C++ car la syntaxe sera plus propre et le compilateur va faire des vérifications sur le type pendant la compilation.
Je ne comprends pas ta question
il n'y a pas d'objet en c -> structure et fonction.
En c++ se sont des classes.
unsigned char *pb=buffer, ici tu as changé le contenu du pb , pas pb non? quand tu ecrits pb=buffer ==> pb a l'adresse du buffer , mais quand tu ecrits *pb=buffer, c'est a dire la valeur du pb = l'adresse de buffer, corrige moi svp
OHHHH putin enfin j'ai compris merci
placement de produit "Canard PC" ? :p
huhu
17:49 "Un octet c'est valeur qui va de 0 a 256 ^^" Tu voulais dire qu'un octet peut contenir une valeur allant de 0 à 255 :)
Oui erratum dans la description de la vidéo
Je suis le seul à mal comprendre? Quand vous expliquez le Stack, vous parlez des variables locales. Mais le stack n'est pas utilisé pour gérer les variables locales, mais uniquement pour le passage de paramètres.
Ben si...
En C, quand on déclare localement une variable, elle se met sur la pile (stack). De cette manière, elles sont dépilées (et détruites donc) à la sortie du bloc.
ça fait longtemps qu'on ne déclare plus les variables en entête de fonction par contre, même en C...
On les déclares où ?
Les recommandations sont de les déclarer le plus localement possible, au moment de leur première utilisation, et si possible dans le bloc les utilisant. Ce sont pour moi, parfois, des considérations quasi religieuses pour certains. Je reste pragmatique et souple, l'idée est de faire du mieux possible sâchant que la perfection n'est pas de ce monde.
A noter que dans mon exemple, je ne déclare pas de variables en entête, sauf celle que j'utilise en 1er bien sûr. Donc je ne comprends pas la remarque de "Le Comédien".
@@gamecodeur D'accord merci David pour tes éclaircissements
@@gamecodeur Non ce n'est pas de la religion, c'est important quand on développe un gros logiciel comme un jeu de réduire au maximum la charge cognitive du relecteur. Il faut éviter de déclarer une variable et ensuite de lui assigner une valeur quelques lignes après. Il faut autant que possible assigner la valeur de variable la ligne où on la déclare et const la valeur si possible. Oublier l'assignement peut mener à des UB très chiants à debugguer.
Cela depend du compilateur, par exemple celui du DDK(pour écrire un driver) de microsoft sortira une erreur de compilation si déclaration des variables n'est pas faite au début du code de la fonction.
0-255
je suis étudiant en l1 informatique et j'ai compris les pointeurs à partir du moment ou j'ai compris qu'un pointeur n'était ni plus n'i moins qu'une variable qui renseigne une adresse (d'une autre variable par exemple)
Les pointeur c'est trop facile
Les developpeurs web en sueur :D !
Mine de rien ça aide à comprendre les notions de valeurs et références, même en JS :)
Bonjour les préjugés ^^