Les pointeurs en C enfin expliqués (tuto débutant)

แชร์
ฝัง
  • เผยแพร่เมื่อ 28 พ.ย. 2024

ความคิดเห็น • 70

  • @phineetemgoua2276
    @phineetemgoua2276 ปีที่แล้ว +7

    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

  • @tonygnavo2468
    @tonygnavo2468 ปีที่แล้ว +1

    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é.

    • @gamecodeur
      @gamecodeur  ปีที่แล้ว

      C'est exactement ça !

  • @josch8611
    @josch8611 2 ปีที่แล้ว +13

    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.

    • @sebastienc8797
      @sebastienc8797 ปีที่แล้ว

      je me posais justement la question, merci de la précision :-)

  • @quentinquadrat9389
    @quentinquadrat9389 2 ปีที่แล้ว +1

    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).

    • @quentinquadrat9389
      @quentinquadrat9389 2 ปีที่แล้ว +1

      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

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      Merci pour les précisions

  • @alarm4007
    @alarm4007 ปีที่แล้ว +1

    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

  • @fredericmonnet4314
    @fredericmonnet4314 2 ปีที่แล้ว +2

    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.

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว +1

      Oui je couvrirai ça ainsi que les pointeurs sur fonctions dans le parcours complet

  • @krog6473
    @krog6473 2 ปีที่แล้ว +1

    Je pense être incollable sur les pointeurs mais j'ai trouvé ça captivant, ça fait du bien de voir une approche différente

    • @gauthierthomas1640
      @gauthierthomas1640 2 ปีที่แล้ว

      si t'es incollable expliques moi stp

    • @krog6473
      @krog6473 2 ปีที่แล้ว

      ​@@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.

  • @yonathanbomisso7650
    @yonathanbomisso7650 ปีที่แล้ว +4

    Bonjour. Belle explication...
    Pouvez-vous svp utiliser les pointeurs pour faire les algorithmes de tri ?

  • @wizzrobert4730
    @wizzrobert4730 2 ปีที่แล้ว

    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 😅).

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      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.

    • @wizzrobert4730
      @wizzrobert4730 2 ปีที่แล้ว

      @@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 😉

    • @hbx380
      @hbx380 2 ปีที่แล้ว +1

      @@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.

    • @wizzrobert4730
      @wizzrobert4730 2 ปีที่แล้ว

      @@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.

  • @nicolask2935
    @nicolask2935 9 หลายเดือนก่อน

    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 !

  • @StarWarsAtari
    @StarWarsAtari 2 ปีที่แล้ว +1

    Salut. Sympa ce petit bout de code sur les pointeurs en C :)

  • @zindroo
    @zindroo ปีที่แล้ว

    Merci super clair en plus j'ai vu certaine notions inconnues ^^

  • @Liolabs
    @Liolabs 2 ปีที่แล้ว +2

    Salut David, Petite fourlache au niveau des valeurs possibles pour un octet.... les valeurs s'étendent de 0 à 255 soit 256 valeurs ;-)

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      Tu as raison j'ai fourché

    • @Liolabs
      @Liolabs 2 ปีที่แล้ว

      @@gamecodeur comme quoi...
      ca arrive même au meilleur ;-)

  • @Inconnu3542
    @Inconnu3542 10 หลายเดือนก่อน

    putain donner a cette homme le prix nobel du meilleur prof de tout les temps👋👋👋👋👋👋👋👋

  • @machinesnoires
    @machinesnoires 10 หลายเดือนก่อน

    Mais que c'est excellent! Merci! : D

  • @dowdheurschtwideul139
    @dowdheurschtwideul139 2 หลายเดือนก่อน

    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.

  • @ourydiallo5611
    @ourydiallo5611 7 หลายเดือนก่อน

    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.

  • @issangolocoulibaly8325
    @issangolocoulibaly8325 2 ปีที่แล้ว

    Merci pour cette vidéo. Que pensez-vous du langage Rust ? l'avez vous deja utilisé dans le domaine du jeux video ?

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      Ça compile en natif et en web assembly donc ça a l'air top. Mais je ne connais pas plus que ça.

  • @gibs2b
    @gibs2b 6 หลายเดือนก่อน

    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.

  • @keopsequinox1624
    @keopsequinox1624 2 ปีที่แล้ว +1

    Petite erreur d'inattention: un octet ca va de 0 à 255, pas 256 ;)

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      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.

  • @VincentEkdev
    @VincentEkdev 6 หลายเดือนก่อน

    dans quel cas ca sert a quelque chose de changer la valeur d'une variable via un pointeur?

    • @gamecodeur
      @gamecodeur  2 หลายเดือนก่อน

      Tu passes le pointeur a une fonction du coup elle devient capable de changer la valeur de la variable

  • @azzaazization
    @azzaazization 4 หลายเดือนก่อน

    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)

    • @gamecodeur
      @gamecodeur  4 หลายเดือนก่อน

      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.

  • @yametetakiro5914
    @yametetakiro5914 2 ปีที่แล้ว

    oh la la vais devoir la regarder plusieurs fois parce que ça fait mal au crâne

  • @raphyzz9563
    @raphyzz9563 8 หลายเดือนก่อน

    Genials merci vrm

  • @fabriceatlan7992
    @fabriceatlan7992 2 ปีที่แล้ว

    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.

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      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.

  • @drumandbassfromju
    @drumandbassfromju ปีที่แล้ว

    A mon humble avis, ça manque un peu de détails. notamment sur comment remplir la zone mémoire pointée par ton buffer.

    • @gamecodeur
      @gamecodeur  ปีที่แล้ว

      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.

  • @Dr.jack59
    @Dr.jack59 2 ปีที่แล้ว

    C'est clair en tout cas

  • @gibs2b
    @gibs2b 6 หลายเดือนก่อน

    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"

  • @jean-christophewhite6715
    @jean-christophewhite6715 2 ปีที่แล้ว

    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 🙏

    • @quentinquadrat9389
      @quentinquadrat9389 2 ปีที่แล้ว

      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.

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      Je ne comprends pas ta question

    • @oblerion
      @oblerion 2 ปีที่แล้ว

      il n'y a pas d'objet en c -> structure et fonction.
      En c++ se sont des classes.

  • @balout1462
    @balout1462 10 หลายเดือนก่อน

    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

  • @Tinaprogramming
    @Tinaprogramming 7 หลายเดือนก่อน

    OHHHH putin enfin j'ai compris merci

  • @gormbygore
    @gormbygore 2 ปีที่แล้ว +1

    placement de produit "Canard PC" ? :p
    huhu

  • @gibs2b
    @gibs2b 6 หลายเดือนก่อน

    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 :)

    • @gamecodeur
      @gamecodeur  2 หลายเดือนก่อน

      Oui erratum dans la description de la vidéo

  • @bendevil8751
    @bendevil8751 7 หลายเดือนก่อน

    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.

    • @gamecodeur
      @gamecodeur  7 หลายเดือนก่อน +1

      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.

  • @EpicSnakes
    @EpicSnakes 2 ปีที่แล้ว

    ça fait longtemps qu'on ne déclare plus les variables en entête de fonction par contre, même en C...

    • @hbx380
      @hbx380 2 ปีที่แล้ว

      On les déclares où ?

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว

      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".

    • @hbx380
      @hbx380 2 ปีที่แล้ว

      @@gamecodeur D'accord merci David pour tes éclaircissements

    • @EpicSnakes
      @EpicSnakes 2 ปีที่แล้ว

      @@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.

    • @fredericmonnet4314
      @fredericmonnet4314 2 ปีที่แล้ว

      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.

  • @skywalker31luc17
    @skywalker31luc17 3 หลายเดือนก่อน

    0-255

  • @winterskiingfr
    @winterskiingfr 2 ปีที่แล้ว

    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)

  • @AlexPresset
    @AlexPresset 14 วันที่ผ่านมา

    Les pointeur c'est trop facile

  • @TSHORYUKEN
    @TSHORYUKEN 2 ปีที่แล้ว +3

    Les developpeurs web en sueur :D !

    • @gamecodeur
      @gamecodeur  2 ปีที่แล้ว +2

      Mine de rien ça aide à comprendre les notions de valeurs et références, même en JS :)

    • @NoName-ei2kb
      @NoName-ei2kb 2 ปีที่แล้ว

      Bonjour les préjugés ^^