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

  Рет қаралды 25,304

Gamecodeur - L'école de jeux vidéo en Ligne

Gamecodeur - L'école de jeux vidéo en Ligne

Күн бұрын

Les pointeurs (en C ou en C++) est un concept qui fait peur.
Pourtant, le malentendu part souvent d'une mauvaise méthode pour les expliquer. Mon défi : vous faire (enfin) comprendre les pointeurs en C.
Erratum : je dis "valeur de 0 à 256" je voulais bien sûr dire "256 valeurs possibles", donc de 0 à 255.
Je t'offre une formation gratuite à la programmation de jeux vidéo sur :
school.gamecod...

Пікірлер: 69
@phineetemgoua2276
@phineetemgoua2276 Жыл бұрын
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
@josch8611
@josch8611 2 жыл бұрын
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 :-)
@tonygnavo2468
@tonygnavo2468 Жыл бұрын
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 !
@yonathanbomisso7650
@yonathanbomisso7650 Жыл бұрын
Bonjour. Belle explication... Pouvez-vous svp utiliser les pointeurs pour faire les algorithmes de tri ?
@quentinquadrat9389
@quentinquadrat9389 2 жыл бұрын
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 жыл бұрын
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 Жыл бұрын
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
@krog6473
@krog6473 2 жыл бұрын
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 Жыл бұрын
si t'es incollable expliques moi stp
@krog6473
@krog6473 Жыл бұрын
​@@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.
@fredericmonnet4314
@fredericmonnet4314 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 жыл бұрын
Oui je couvrirai ça ainsi que les pointeurs sur fonctions dans le parcours complet
@nicolask2935
@nicolask2935 8 ай бұрын
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 !
@ourydiallo5611
@ourydiallo5611 5 ай бұрын
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.
@Liolabs
@Liolabs 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 ;-)
@dowdheurschtwideul139
@dowdheurschtwideul139 Ай бұрын
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.
@gibs2b
@gibs2b 5 ай бұрын
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.
@Inconnu3542
@Inconnu3542 9 ай бұрын
putain donner a cette homme le prix nobel du meilleur prof de tout les temps👋👋👋👋👋👋👋👋
@StarWarsAtari
@StarWarsAtari 2 жыл бұрын
Salut. Sympa ce petit bout de code sur les pointeurs en C :)
@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 жыл бұрын
@@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 KZbin 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.
@zindroo
@zindroo Жыл бұрын
Merci super clair en plus j'ai vu certaine notions inconnues ^^
@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.
@azzaazization
@azzaazization 2 ай бұрын
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 2 ай бұрын
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.
@balout1462
@balout1462 8 ай бұрын
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
@machinesnoires
@machinesnoires 8 ай бұрын
Mais que c'est excellent! Merci! : D
@gibs2b
@gibs2b 5 ай бұрын
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.
@VincentEkdev
@VincentEkdev 4 ай бұрын
dans quel cas ca sert a quelque chose de changer la valeur d'une variable via un pointeur?
@gamecodeur
@gamecodeur 20 күн бұрын
Tu passes le pointeur a une fonction du coup elle devient capable de changer la valeur de la variable
@yametetakiro5914
@yametetakiro5914 2 жыл бұрын
oh la la vais devoir la regarder plusieurs fois parce que ça fait mal au crâne
@raphyzz9563
@raphyzz9563 6 ай бұрын
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.
@keopsequinox1624
@keopsequinox1624 2 жыл бұрын
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.
@Tinaprogramming
@Tinaprogramming 5 ай бұрын
OHHHH putin enfin j'ai compris merci
@Dr.jack59
@Dr.jack59 2 жыл бұрын
C'est clair en tout cas
@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.
@gormbygore
@gormbygore 2 жыл бұрын
placement de produit "Canard PC" ? :p huhu
@gibs2b
@gibs2b 5 ай бұрын
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 20 күн бұрын
Oui erratum dans la description de la vidéo
@bendevil8751
@bendevil8751 6 ай бұрын
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 5 ай бұрын
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.
@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)
@skywalker31luc17
@skywalker31luc17 Ай бұрын
0-255
@TSHORYUKEN
@TSHORYUKEN 2 жыл бұрын
Les developpeurs web en sueur :D !
@gamecodeur
@gamecodeur 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 ^^
C++ vs Rust: which is faster?
21:15
fasterthanlime
Рет қаралды 397 М.
TUTO C - #14 Les pointeurs (introduction)
10:58
Boris ('PrimFX')
Рет қаралды 82 М.
Help Me Celebrate! 😍🙏
00:35
Alan Chikin Chow
Рет қаралды 78 МЛН
规则,在门里生存,出来~死亡
00:33
落魄的王子
Рет қаралды 29 МЛН
Ozoda - Lada ( Official Music Video 2024 )
06:07
Ozoda
Рет қаралды 25 МЛН
Premature Optimization
12:39
CodeAesthetic
Рет қаралды 817 М.
Programmer un jeu : Ce qu'on ne t'apprend JAMAIS
31:22
Gamecodeur - L'école de jeux vidéo en Ligne
Рет қаралды 3,2 М.
Programmation vs Codage - Quelle est la différence ?
6:18
Daara Academy
Рет қаралды 1,1 М.
Langage C #11 - pointeurs
40:59
FormationVidéo
Рет қаралды 373 М.
Master Pointers in C:  10X Your C Coding!
14:12
Dave's Garage
Рет қаралды 313 М.
#25 Langage C -Les Pointeurs - Partie 1 (Définition)
24:01
Programming With HAIRIBI
Рет қаралды 46 М.
Compilers, How They Work, And Writing Them From Scratch
23:53
Adam McDaniel (kiwi)
Рет қаралды 194 М.
Unity c'est de la merde. et je vous avais prévenu.
11:14
Gamecodeur - L'école de jeux vidéo en Ligne
Рет қаралды 12 М.
27 exercices de programmation pour booster votre raisonnement
27:41
Gamecodeur - L'école de jeux vidéo en Ligne
Рет қаралды 9 М.
Help Me Celebrate! 😍🙏
00:35
Alan Chikin Chow
Рет қаралды 78 МЛН