Bonjour et bienvenue à nouveau.
Nous sommes dans une nouvelle section. Cette section est nommée pointeurs.
C'est probablement la section la plus importante du cours.
C'est probablement aussi la partie la plus difficile du cours. Le concept de
pointeurs et de c est un concept délicat et délicat.
Mais nous allons le traverser très lentement.
Nous allons donner beaucoup de conférences et procéder étape par étape.
Nous allons commencer au plus haut niveau et entrer de plus en plus dans les détails.
Vous devez comprendre les pointeurs si vous voulez profiter pleinement
du langage C. C'est donc très important.
Commençons donc par le haut et parlons de ce concept d'indirection, qui
est essentiellement le même concept qu'un pointeur.
Les pointeurs sont donc très similaires au concept d'indirection.
Vous utilisez l'indirection dans votre vie de tous les jours. Par exemple, si je décris
ce que signifie l'indirection, ce serait comme si vous
deviez acheter quelque chose de nouveau, un nouveau produit dans votre entreprise.
Par exemple, disons que vous deviez acheter une nouvelle cartouche d'encre pour votre imprimante.
Si vous travaillez dans une grande entreprise, vous devrez
probablement passer par un certain département pour
acheter de nouveaux achats. Vous iriez donc probablement au service des achats.
Vous appelleriez probablement quelqu'un lors de l'achat et
lui demanderiez de commander la nouvelle cartouche pour vous.
Ce serait leur travail de trouver ensuite un
magasin local qui fournit l'article que vous souhaitez commander.
Et ce que cela signifie, c'est que vous n'allez pas commander cet article directement par vous-même.
Vous demandez à quelqu'un de le faire pour vous.
Et puis, grâce à leur expertise et à leur connaissance
de qui a ce produit en inventaire, ils
vous le rendent.
C'est donc un niveau d'indirection qui vous concerne. Vous n'allez pas de l'avant
et allez simplement au magasin et achetez-le. Vous allez au service des achats, le
service de la personne sait qu'il va et fait tout pour vous.
C'est le même concept de pointeur en programmation.
Dans les langages de programmation, l'indirection est la capacité de référencer quelque chose en utilisant un
nom, une référence ou un conteneur au lieu de la valeur elle-même.
Nous utilisons une forme d'interaction en utilisant des noms de variables.
Nous n'utilisons pas l'adresse mémoire pour accéder aux données.
Nous utilisons un nom de variable.
La forme la plus courante d'indirection consiste à manipuler une valeur
via son adresse mémoire.
Ainsi, en plus d'une très
petite description d'indirection utilisant un nom de variable pour représenter une adresse mémoire,
vous manipulez également une valeur via son adresse mémoire en utilisant l'adresse elle-même.
l'adresse elle-même.
Ainsi, un pointeur fournit un moyen indirect d'accéder à la valeur d'un élément de données particulier.
C'est une variable dont la valeur est une adresse
mémoire, et c'est essentiel à comprendre.
Nous avons appris jusqu'à présent des variables qui contiennent certains types
de données, des nombres, des
caractères, des doubles, des flottants avec des nombres rationnels.
Nous allons maintenant avoir une variable qui
ne stocke aucun de ce type de données.
Le type de stockage de données est une adresse mémoire.
L'adresse mémoire sera représentée par un entier, un nombre
hexadécimal, mais ce
sera toujours une adresse mémoire.
Ce sera donc la valeur
d'une adresse et d'un autre emplacement de mémoire s'il s'agit d'une variable
existante ou d'un nouvel emplacement que vous allouez dynamiquement.
Donc, tout comme il y a des raisons pour lesquelles il est logique de
passer par le service des achats pour commander de nouvelles
cartouches, vous n'avez pas besoin de savoir dans quel magasin particulier les cartouches sont commandées, par exemple.
Il y a aussi de bonnes raisons pour lesquelles il est
judicieux d'utiliser des pointeurs et d'utiliser ces variables qui représentent une adresse, une adresse mémoire.
Nous avons parlé d'adresses de mémoire au tout début du cours.
Et comment chaque fois que vous exécutez un programme et que vous créez des variables, celles-ci sont stockées en mémoire.
Et cette mémoire a une adresse particulière. Vous devez connaître l'adresse pour récupérer ces
données, tout comme vous devez connaître l'adresse d'une maison si vous allez conduire quelque part
ou l'adresse d'un lieu.
L'utilisation de pointeurs dans votre programme est donc l'un des outils les plus puissants disponibles en langage c.
C'est pourquoi il est important de comprendre.
Tout programme en c qui est substantiel va utiliser des pointeurs.
Vous devez donc comprendre ce concept.
Et pour les programmeurs qui ont programmé des langages plus modernes comme
java ou ou c sharp, vous n'avez pas nécessairement à
vous en soucier car toute
l'allocation de mémoire et il n'y a pas
de véritable concept de pointeurs.
Même sous le capot,
java utilise des pointeurs car ils ont des copies de références.
C'est le même genre de concept. Mais en c, vous
avez explicitement une variable qui représente une adresse.
Les pointeurs sont également l'un des concepts les plus déroutants du langage c.
Ils ont tendance à être maltraités,
ils ont tendance à ne pas être entièrement compris, en particulier par les nouveaux programmeurs.
Il est donc important que vous compreniez ce concept au début et que vous
ayez une idée claire de ce qui se passe alors que
vous entrez dans un concept de pointeurs de plus en plus avancé et de plus en plus avancé.
Donc, si vous ne comprenez pas cela au
début, étudiez, étudiez, étudiez, entraînez-vous à écrire du code avec des pointeurs.
Le compilateur doit connaître le type de données stockées dans
la variable vers laquelle il pointe. C'est donc comme une variable régulière
et que vous devez spécifier le type de données lorsque vous créez le pointeur.
La raison pour laquelle le compilateur a besoin de savoir que c'est la même raison pour
les variables, il a besoin de savoir combien de données allouer même si vous pointez vers certaines données.
Chaque pointeur va être associé à un type de variable spécifique.
Il ne peut être utilisé que pour pointer vers des variables
de ce type, nous en donnerons un exemple lorsque nous parlerons de définir un pointeur.
Ainsi, par exemple, les pointeurs de type pointer
vers lui ne peuvent pointer que vers des variables de type int.
Encore une fois, une variable
a la valeur d'une adresse, c'est un pointeur.
Cette adresse peut contenir une valeur quelque part en mémoire.
Les pointeurs de type pointer vers float ne peuvent pointer que vers des variables de type float.
Voici donc une idée illustrative
qui vous donne le concept d'un pointeur.
Ne vous inquiétez pas de la syntaxe ici.
Nous en avons brièvement discuté dans les conférences précédentes, cette esperluette et cet astérisque, vous n'avez
pas nécessairement à vous en soucier. Ce que je veux que
vous fassiez attention ici, c'est comment un pointeur a une adresse, et
cette adresse peut contenir une valeur mais être ailleurs dans la mémoire.
Donc, dans cet exemple, nous créons un nombre régulier, nous
avons créé un million de fois, puis vous voyez cette syntaxe avec l'astérisque qui
signifie que c'est un pointeur. Nous allons passer en revue cela en détail.
Vous voyez également l'esperluette, ce qui signifie que c'est une adresse.
Donc, dans cet exemple, lorsque nous créons ce pointeur de type int p
number, nous attribuons une adresse. Parce que rappelez-vous, les pointeurs ne peuvent stocker que des adresses.
Et comment cela est réellement mis en mémoire, c'est que
vous avez un numéro de nom de
variable et que number a une valeur de 99.
Le numéro a également une adresse en mémoire.
Cette adresse en mémoire est la valeur du pointeur.
Le nombre p est donc un pointeur qui pointe vers l'adresse 1008.
1008 a une valeur de 99, contient également le
numéro de la variable.
C'est donc là que nous voulons en venir. Si ce n'est pas clair, vous devez l'examiner
pendant une heure et vous assurer de bien le comprendre.
Encore une fois, le point est qu'un pointeur a une valeur
sur une adresse, c'est ce qu'il stocke.
Et puis, vous pouvez accéder à la valeur de cette adresse en utilisant une certaine syntaxe.
Alors pourquoi utiliser des pointeurs, pourquoi même aborder ce concept, pourquoi ne pouvons-nous pas
simplement utiliser les types de données existants
que nous utilisons et utiliser le tableau de caractères lorsque nous voulons utiliser des chaînes.
Eh bien, accéder aux données uniquement au moyen de variables est très limité.
Avec les pointeurs, vous pouvez accéder à n'importe quel emplacement, vous pouvez traiter n'importe quelle position
de la mémoire comme une variable par exemple, puis vous pouvez également effectuer de
l'arithmétique avec des pointeurs, ce qui facilite les choses.
Les pointeurs en c facilitent l'utilisation des tableaux et des
chaînes, et nous allons également passer en revue cela, c'est un autre avantage d'utiliser des pointeurs.
Les pointeurs vous permettent de faire référence au même espace et à la même mémoire avec plusieurs emplacements.
Donc, ce que cela signifie, c'est que vous pouvez mettre à jour
la mémoire à un emplacement, puis le changement peut être vu depuis un autre emplacement dans votre programme.
C'est une façon d'utiliser en quelque sorte des données globales mais toujours encapsulées dans des fonctions.
Vous pouvez également économiser beaucoup d'espace mémoire en pouvant partager des composants dans vos
structures de données.
Alors rappelez-vous, quand c a été inventé, c a été inventé dans les années 70.
L'idée de c était d'être très efficace et d'être de bas niveau.
L'idée d'accéder à la mémoire directement via des pointeurs est
très efficace,
et c'est aussi très rapide.
Les pointeurs permettent également aux fonctions de modifier les données qui leur sont transmises
en tant que variables. Ceci est passé par référence. Nous allons avoir une conférence à ce sujet.
C'est ici que vous pouvez passer des arguments à une fonction avec vos pointeurs.
Et puis à l'intérieur de la fonction, lorsque vous modifiez ces
données, le changement sera reflété à l'extérieur de cette fonction.
Nous n'avons donc plus besoin d'utiliser des données globales.
Nous pouvons utiliser des données à l'intérieur d'une fonction, passer ces
données en tant que pointeur, puis ces données en dehors
de cette fonction seront allouées. Donc, ce n'est pas l'inconvénient d'utiliser
des variables globales où tout est étroitement couplé, vous pouvez limiter
cela aux seules données qui ont besoin uniquement des fonctions qui ont besoin de connaître ces données.
Comme je l'ai mentionné, il peut également être utilisé pour optimiser le programme pour qu'il s'exécute
plus rapidement et utilise moins de mémoire qu'il ne
le ferait autrement, ce qui est
un concept important, en particulier dans les programmes en temps réel embarqués.
Les pointeurs nous permettent également d'obtenir plusieurs valeurs à partir d'une fonction.
Nous avons parlé des fonctions sur la façon dont vous pouvez transmettre des fonctions de données.
Nous avons également expliqué comment vous pouvez renvoyer des données.
Nous savons qu'à l'heure actuelle, vous ne pouvez renvoyer qu'une seule valeur à partir d'une fonction.
Mais si vous utilisez des pointeurs, vous pouvez en fait renvoyer plusieurs valeurs à partir d'une fonction.
Et nous allons en parler. C'est un gros avantage.
Nous allons également parler d'allocation de mémoire dynamique.
À l'heure actuelle, lorsque nous créons de la mémoire pour un programme, cela
est fait implicitement par le compilateur lorsque vous déclarez une variable.
Si vous déclarez une variable int, il crée automatiquement 4 octets pour cette variable par exemple.
Lorsque vous utilisez des tableaux et que vous spécifiez la taille
d'un tableau, cette taille est allouée au moment de la compilation.
Donc, si vous essayez de stocker plus de données que cela, vous êtes
foutu, votre programme ne fonctionnera pas.
Mais si vous aviez la possibilité
de créer autant de mémoire que nécessaire à l'exécution,
ce serait énorme. Et les pointeurs vous permettent de le faire.
Ils vous permettent de créer de la mémoire lors de l'allocation de mémoire dynamique à l'exécution.
Nous allons également parler de tout cela.
Les pointeurs nous permettent de concevoir et de développer des structures de données plus complexes.
Et la structure de données est quelque chose qui stocke des données.
Des exemples de structures de données sont empiler une cue ou une liste chaînée.
Et nous pouvons les créer beaucoup plus facilement en utilisant des pointeurs.
Les pointeurs fournissent un accès direct à la mémoire, encore une fois, efficace et rapide.
Les pointeurs seront donc un gros concept. Nous allons avoir beaucoup de conférences sur les pointeurs.
Je veux que vous vous concentriez, et je veux que vous soyez attentifs lorsque je parle de
tous ces concepts, car c'est important et vital pour comprendre le langage de programmation c.
Alors bonne chance et commençons. Merci.