Transcription
1. 1 Introduction: Bonjour et bienvenue à ce
nouveau cours dans lequel nous allons
mâcher des pointeurs en C.
Dans ce cours, vous
apprendrez ce que sont les pointeurs, comment ils nous permettent d'
optimiser le code du programme. Et vous apprendrez
comment convertir des types de données
complexes en
une séquence d'octets. Vous pouvez développer des programmes
sans utiliser de pointeurs, mais ils accélèrent considérablement l'exécution du code
du programme, ce qui est particulièrement important lorsque vous travaillez avec des
microcontrôleurs. Et dans ce cours, nous couvrirons
tout cela. La plupart d'entre vous savent que les
pointeurs sont
l'un des sujets les plus importants. Pour tous les ingénieurs de
systèmes embarqués. Quiconque programme en C doit utiliser des pointeurs sinon il échouera derrière. Beaucoup d'entretiens ou de développeurs de systèmes
embarqués, les entretiens posent beaucoup de
questions sur les pointeurs. Et l'objectif de ce cours
est de vous aider à commencer et à apprendre à utiliser pointeurs et les différents
types de pointeurs, couvrant de nombreux sujets
importants. Nous vous expliquerons tout et nous vous donnerons des exemples
pratiques, des devoirs et beaucoup d' autres ressources pour
vous aider à maîtriser les pointeurs en C. Maintenant, disons que nous allons ce que vous allez faire
apprendre dans ce cours. Vous apprendrez l'
adressage indirect à l'aide de pointeurs. Ensuite, nous aborderons différents
types de pointeurs. Après cela, nous
parlerons de pointeurs, deux types principaux et de
pointeurs vers les tableaux. Nous parlerons également de
pointeurs vers les fonctions. Pointeurs, opérations de vide, de
variables dynamiques et de
pointeurs. Ensuite, nous parlerons des
types de données, de la conversion
à l'aide de pointeurs. Et tous ces sujets
seront abordés en détail. Encore une fois, vous prendrez
des missions pour que nous soyons certains que vous avez obtenu
ce que nous avons expliqué. Nous expliquerons également
des exemples pratiques. Nous allons les résoudre ensemble pour vous offrir une expérience
pratique. Merci d'avoir regardé cette
introduction. On se voit à l'intérieur.
2. 2 Introduction aux conseils en C: Bonjour et bienvenue dans
cette nouvelle leçon dans laquelle nous allons
parler de pointeurs. Pointer est une
variable qui stocke l'adresse mémoire sous forme de valeur h. Les choses ne sont peut-être pas
claires à ce stade. Parlons donc d'abord de la syntaxe de
création d'un pointeur. Nous parlerons ensuite
de cette définition. Comme vous pouvez le voir ici, nous avons syntaxe
différente pour
définir un pointeur. La première consiste à
saisir le type de pointeur, ajouter le signe d'astérisque, puis à saisir le
nom du pointeur et à ajouter un point-virgule. La même chose se produit ici, mais au lieu d'
écrire l'astérisque près du nom du pointeur, nous l'écrivons près
du type de pointeur. La troisième syntaxe est la
même que les deux premières, mais nous laissons de l'espace après et avant
le signe d'astérisque. Maintenant, en pratique, vous pouvez voir ici que nous avons un
pointeur appelé PTR. Le type de ce
pointeur est entier. Et pour faire ce pointeur, il
faut ajouter le signe astérisque. Maintenant, nous l'ajoutons
juste avant le nom du pointeur. Ici, nous l'ajoutons juste
après le type de pointeur. Et ici, nous
l'ajoutons au milieu entre le
nom du pointeur et le type. Maintenant, comme vous pouvez le constater ici, il n'y a aucune différence entre
ces trois syntaxes. Tous définissent un pointeur pointant vers un type entier, qui est l'
objectif principal d'un pointeur. Maintenant, encore une fois, un pointeur pointe. Il s'agit d'un pointeur qui pointe
vers un emplacement en mémoire. Encore une fois, le pointeur
est une variable qui stocke l'
adresse mémoire comme valeur. Maintenant, pour clarifier les choses, c'est un exemple. L'adresse de l'opérateur est un opérateur unaire
représenté par le symbole. Et maintenant, si vous regardez ce symbole
ici, c'est
ce que l'on appelle l'adresse
du signe et. Il indique l'adresse de n'importe quelle variable si elle est précédée
du nom de la variable. Pour que cela soit plus clair, si nous écrivons ceci et x, maintenant ce x signifie
me donner l'adresse de x. L'adresse de x
sera stockée dans PTR. Et dans ce cas, nous
avons ce souvenir. Et il s'agit de la variable x. Maintenant, l'adresse de la
variable x est 1000. Maintenant, la valeur de x est
dix à l'intérieur par mémoire, mais le risque publicitaire de x en
mémoire est de 1 000. Donc, pour
atteindre ce nombre, qui est de 1 mille, nous
devons écrire ceci et x. Donc, PTR ici égalisera 1 mille parce que
nous utilisons le non signé, ce qui signifie l'adresse. L'adresse de l'opérateur est donc un opérateur qui
ne prend qu'un seul argument. C'est essentiellement le symbole et. Il indique l'adresse
de n'importe quelle variable si elle est précédée
du nom de la variable. Maintenant. Et x est égal à dix, ce qui est le suivant. Maintenant, x est égal à dix. C'est une phrase correcte. Nous sommes en train de créer une nouvelle
variable appelée x. Nous lui donnons une valeur de dix. Il va donc aller dans la mémoire, créer une nouvelle variable
appelée x ici, et elle lui donne
une valeur de dix. Maintenant, int signe astérisque PTR, nous créons un pointeur de type
entier appelé BT off. Et voici ce point
ou que nous avons créé VTR. Et le type de données est entier. La dernière étape consiste ajouter une adresse
à l'intérieur du pointeur. Pour ce faire, nous utilisons cette ligne, PTR équivaut à l'adresse de x. Maintenant, un signe, encore une fois, il est annulé d'autres. Nous allons trouver
l'adresse de x, et nous allons stocker
l'adresse de x dans BPR. Donc l'adresse de x
ici est de 1 000. Nous stockons donc 1 000 à l'intérieur de BT utilisent cette ligne. Maintenant. Ajouter ceci sur PTR équivaut à quoi ? Pouvez-vous y penser ? Nous l'avons déjà mentionné et
sinus est l'adresse de VTR, est maintenant une variable de mémoire. C'est un pointeur, mais il
a un emplacement en mémoire. Donc c'est tout PTR
et l'autre, donc le magnétoscope est des années 2000, donc t équivaut à 2 mille. Ce signe s'appelle donc
l'adresse du sinus. Maintenant, gardez à l'esprit que ce
pointeur lui-même est une variable, possède une adresse dans la mémoire de données. Comme n'importe quelle variable. La seule différence
est que le pointeur contient l'adresse d'une
autre variable. Il ne contient pas de données régulières, il contient une adresse
d'une autre variable. Maintenant, effacons l'écran pour que nous puissions le finaliser. Maintenant, nous avons défini ici un
entier nommé x et l'initialisons souvent
avec une valeur. Ensuite, nous avons défini un pointeur
sur int nommé VTR. Après cela, nous avons initialisé
PTR avec l'adresse x. De
cette façon, nous avons
tout prêt. Maintenant, nous pouvons effectuer certaines opérations. abord, nous avons déjà défini
notre variable nommée x, dont le type est entier, et nous lui avons donné une valeur de dix. Nous avons défini le pointeur sur n
magnétoscope nommé et nous l'avons initialisé. Maintenant, dans ce cas,
regardez cette phrase. Nous avons le signe d'astérisque et nous avons le nom du pointeur. Et nous avons ici des égaux. Maintenant, l'opérateur de
déréférencement est un opérateur unaire représenté
par l'astérisque du symbole. C'est ce qu'on appelle opérateur
de déréférencement. Et vous devez
mémoriser ces noms que nous avons déjà mentionnés et qui en
sont l'adresse. Nous avons maintenant le signe astérisque, qui est l'opérateur de
déréférencement. Il s'agit de NOT opérateur, ce qui signifie qu'il ne
prend qu'une seule variable. Il fonctionne sur une
variable pointeur et permet d' accéder
à la variable vers laquelle
le pointeur pointe. Maintenant, les choses ne sont peut-être pas
claires à ce stade, mais nous l'appelons d
électrons parce que cela supprime le
besoin de l'adresse. Et il vous permet
de
traiter directement la variable vers laquelle
le pointeur pointe. Expliquons cela
par un exemple. Comme vous pouvez le voir ici, nous
avons x, nous avons un magnétoscope. Maintenant, PTR a l'adresse x, qui est de 1 mille, et x a une valeur de 50. Nous savons déjà que
x a une valeur de dix. Et pour le changer à 50, nous procédons comme suit. La première chose que
nous faisons ici est que nous écrivons cet opérateur de
déréférencement. Et vous pouvez le voir ici. Ensuite, le nom du pointeur. Maintenant, cela signifie aller à PTR et
vérifier l'adresse à l'intérieur, qui est de 1 000. Et accédez à la variable
qui a cette adresse. Donc, dans ce cas, le PTR de
référence signifie x, car 1 mille
pointent vers x ici, qui est cette variable. Et nous disons que nous voulons en stocker 50 à l'intérieur. Nous ne le stockons pas dans
PTR. Ptr le fait, c'est ça. Nous le stockons à l'intérieur de
cette référence div de PTR, qui est essentiellement
la variable x. x est
donc égal à 50. C'est pourquoi nous en enlevons dix. Et maintenant, une nouvelle valeur est 50. Maintenant, nettoyons l'ANC
et expliquons à nouveau. Maintenant, la valeur x est dix. Lorsque nous utilisons l'opérateur de
déréférencement, qui est le signe d'astérisque, nous lui demandons de déréférencer
PTR, qui est un pointeur. déréférencement d'un
pointeur signifie aller à la variable vers laquelle un
pointeur pointe. Et dans ce cas, le pointeur pointe avec cette
adresse vers la variable x.
Ainsi, en écrivant un astérisque
ou un
déréférencement PTR, nous lui demandons également d'aller
à x et de la rendre égale à 50. Expliquons-le maintenant. Si nous avons une autre variable, disons que nous en avons ici et que nous en avons 3 000 ici, ce qui est l'adresse. Et nous avons un autre
PTR ici entre la R1. Et ajoutons l'adresse
de y, 3 000. Maintenant, si vous l'avez écrit comme ça. Faisons maintenant la valeur de 55. Ajoutons le signe d'astérisque PT
R1 égal, disons 15. Maintenant, cela signifie un déréférencement. Pt R1 signifie aller à la variable ou aller
au pointeur appelé BT R1. Récupérez l'adresse de celle-ci et vérifiez la variable
vers laquelle cette adresse pointe cette adresse pointe et modifiez
sa valeur à 15. La première étape consiste donc à aller
au pointeur PT R1,
en vérifiant l'adresse. Après avoir vérifié l'adresse, accédez à la variable vers laquelle
cette adresse pointe, qui est ici y, et changez la
valeur de y à 15. Donc maintenant, y est égal à 15. Maintenant, pour résumer les choses, le non signé signifie
l'adresse de PTR. Lorsque nous ajoutons un
signe d'astérisque avant le pointeur, nous déréférençons
le pointeur. Nous lui donnons donc la possibilité d'accéder à la variable vers laquelle le
pointeur pointe. Et c'est l'objectif principal
de ce signe de déréférencement. Maintenant, dans la prochaine leçon, nous allons résoudre un exemple
pratique selon lequel j'ai besoin que vous
essayiez de le résoudre vous-même. J'avais besoin de créer un programme
qui définit un entier et de l'initialiser avec
eux, puis de l'imprimer. Ensuite, définissez un
pointeur pointant vers cet entier et
modifiez la valeur de l'entier via
le pointeur sur B20. Puis imprimez-le à nouveau. Maintenant, la sortie attendue est
x avant que le changement ne soit dix. X après changement est de 20. Assurez-vous de le résoudre avant passer à la leçon suivante. Merci d'avoir regardé cette leçon.
3. 3 Résoudre le premier exemple pratique: Bonjour et bienvenue dans cette
nouvelle leçon dans laquelle nous
allons résoudre la
première question. Vous devez créer un programme
qui définit un entier et l'initialiser avec
dix, puis l'imprimer. Par la suite. Définissez un pointeur qui
pointe vers cet intérieur et modifiez la valeur
du n à travers les
pointeurs sur B20. Puis imprimez-le à nouveau. La sortie doit être la suivante. X est dix, puis x après l'avoir changé à l'aide du
pointeur, il sera 20. Pour résoudre cette question, tous
utilisent Visual Studio Code. Accédez au menu Démarrer et à
droite code Visual Studio. Le voilà. Maintenant. Vous devez créer un nouveau
fichier ou un nouveau projet. Maintenant, fichier, nouveau fichier. Et ici, vous devez cliquer sur sélectionner une langue et choisir C. Maintenant, nous sommes prêts à y aller. La première étape consiste à inclure la bibliothèque de
chaînes de sortie d'entrée std .h, qui est la principale bibliothèque de sortie
d'entrée standard pour notre programme. Je devrais donc inclure les
MST. Ordre à graver. Après cela, vous
devrez aller à n. Je veux dire, ce sera notre fonction principale
qui sera exécutée, ne
prendra rien qui soit vide. Et la première étape consiste
à définir un nouvel entier. Donc, x est égal à 0. Ensuite, imprimez f. Demandons à l'
utilisateur d'entrer la valeur. Veuillez donc entrer un numéro. Maintenant, nous devons scanner
ce numéro en utilisant le scan f. Le nombre que nous allons sortir que je vais
numériser sera un nombre décimal. Donc, ici, c'est vrai. Tout cela a été expliqué dans
notre cours de programmation C. Et il n'est pas nécessaire d'expliquer
à nouveau parce que nous enseignons des
pointeurs ici. Maintenant. Nous devons imprimer à nouveau la valeur précédente
et la nouvelle valeur. Donc x avant le changement. X avant changement est
le pourcentage d. Nous devons
maintenant changer
x à l'aide de pointeurs. Créons donc un nouveau pointeur. Faisons
pointer l'adresse de x. Maintenant, pour modifier la valeur de x, nous allons utiliser l'opérateur de
déréférencement, qui est le PTR astérix, et le rendre égal à 20, ce qui est la nouvelle valeur. Et nous allons imprimer la
même ligne, qui est la suivante. Mais nous le dirons après le changement. Maintenant, nous avons tout
prêt et prêt. Nous pouvons modifier ce x avec le PTR de référence et
nous planifierons la même chose. Nous pouvons ajouter ici, cet UTR et l'autre discipline
que cela signifie également x, car nous déréférençons
l'adresse dans PTR, qui est l'adresse de x, donc c'est la valeur de x. UTR et l'autre discipline
que cela signifie également x,
car nous déréférençons
l'adresse dans PTR,
qui est l'adresse de x,
donc c'est la valeur de x.
, remarquez le code. Vous pouvez simplement le coller
sur le Bloc-notes Plus, Plus, comme nous l'avons déjà
expliqué, et l'enregistrer. Appelons ça des pointeurs par exemple. Maintenant, nous devons l'enregistrer sous forme de
point c. Et nous allons le lancer. Maintenant, ce que montre l'IGCSE,
par exemple, Nazi. Après cela, écrivez un fichier EXE de points. Et comme vous pouvez le voir,
c'est demander à Dieu, s'il vous plaît entrer un numéro.
Disons cinq. Maintenant, x avant le changement est cinq, x après le changement est 20, qui est exactement ce que
nous avons fait ici. Nous modifions la valeur
de x à l'aide de pointeurs. C'est tout pour cette leçon.
Merci d'avoir regardé.
4. 4 Passer par valeur et passer par adresse en C: Bonjour et
bienvenue dans cette nouvelle leçon dans laquelle nous allons
expliquer le passage par valeur
et le passage par adresse. Dans cette leçon, nous allons discuter ces deux onglets de transmission de
la valeur et de l'adresse. Le premier type est
transmis par valeur. Cela signifie que vous effectuez
une copie en mémoire de la
valeur réelle des paramètres transmise. Une copie du contenu
du paramètre réel. Dans le passé, par adresse
ou par référence. Vous effectuez essentiellement une copie en mémoire de l'adresse
du paramètre réel. Deux ne font pas
de copie de la valeur du paramètre. Nous effectuons une copie en mémoire de l'adresse
du paramètre réel. Jetons maintenant un coup d'œil
à ces exemples. Encore une fois, le passage par valeur fera une copie en mémoire du paramètre
réel alors que la transmission par adresse ou le
refinancement fera une copie en mémoire de l'adresse
du paramètre réel. Nous sommes donc en train de faire
une copie de l'adresse. Ici, nous faisons une copie
du paramètre réel. Maintenant, comme vous pouvez le voir
dans cet exemple, nous avons
ici une fonction et cette fonction est appelée
par fonction de valeur. Elle prend un entier x. Maintenant, cette fonction
prend un argument par valeur car elle prend
une valeur réelle, qui est essentiellement une
variable x de type entier. Maintenant, ici, lorsque nous
appelons la fonction, nous transmettons la variable
en faisant une copie
du paramètre réel. Nous ne traitons ici que
des valeurs réelles, des paramètres
réels, nous
ne traitons pas d'adresses. Maintenant, quand il s'agit de
passer par adresse ou référence, comme vous pouvez le voir, dans cette fonction, nous avons
une fonction appelée par d'autres fonctions et elle
prend un pointeur comme entrée. Donc, astérisque entier PTR, c'est un pointeur. Maintenant, cette fonction prend
une adresse étrange. L'entrée de cette
fonction doit donc être une adresse. Et nous passons la
variable z par d'autres ici. Nous ne pouvons pas ajouter car il s'
agit essentiellement d'une valeur. Et cette fonction
veut une adresse. Nous avons donc ajouté le signe et, ce qui signifie l'adresse de
celui-ci. Comme vous pouvez le voir ici. Maintenant, l'adresse de z sera transmise à la fonction d'
adresse d'octets. Alors que la valeur de z
sera passée par fonction de valeur. Nous faisons donc essentiellement une copie du paramètre
réel. Pendant que nous sommes ici en train de
faire une copie en mémoire de l'adresse dont l'adresse
est l'adresse du paramètre
réel. Et c'est la principale
différence entre passer par valeur et
passer par adresse. Il existe différents cas
d'utilisation et vous allez prendre quelques exemples
pratiques. Mais c'est tout ce
que vous devez savoir pour l' instant sur le passage par valeur
et le passage par adresse.
5. 6 conseils d'incrément et de déformation: Bonjour et bienvenue dans
cette nouvelle leçon. Nous parlerons
des opérations sur des pointeurs. Maintenant. La première opération dont nous
allons parler concerne
les opérations d' incrément et de
décrément. L'
opération d'incrémentation incrémente la valeur du pointeur d'une étape. Maintenant, nous n'avons pas dit d'un octet
parce que cette étape pourrait être 148 ou n'importe quel nombre d'octets
correspond à la taille du point t. Maintenant, si nous écrivons PTR plus plus, si nous supposons que PTR est
un pointeur sur un entier, alors quand nous sommes
en disant plus, plus, nous allons faire un pas entier, qui est essentiellement de quatre octets. Selon votre compilateur. Le compilateur possède un
nombre entier de quatre octets. Cela signifie que chaque
incrément
ajoutera quatre octets à
l'adresse de PTR. En supposant maintenant qu'une
adresse PTR est de 1 000, cela signifie que nous sommes maintenant à 1004 en raison de
ces quatre octets. Ainsi, chaque incrément
ou chaque
incrément de pointeur incrémentera la valeur du
pointeur d'une étape. Encore une fois, le talon correspond à la
taille du pointu sans entier,
chaîne ou caractère, ni quel que soit le type de données. En ce qui
concerne le décrément, c'est le même scénario. Décrémente la
valeur du pointeur d'un pas. C'est écrit comme
ça, PTR moins moins. Et si nous supposons que l'
entier est de quatre octets, cela signifie qu'il ira
quatre pas en arrière, il deviendra 996. Et c'est essentiellement comme ça les incréments et les décréments. Voyons maintenant cela en pratique. Commençons par
un exemple simple. Hash inclut stdio.h. Maintenant, int main, vide. Et choisissons la
langue qui doit être c. Maintenant, créons une nouvelle
variable et x est égal à dix, et créons un pointeur. Maintenant, PTR détiendra
l'adresse de x. Et voici
trois phrases simples. Maintenant, ce que nous devons faire, c'est d'
augmenter ou de diminuer le PTR. Mais il faut d'abord imprimer. allons donc écrire adresse PTR, et nous devons imprimer l'
adresse du pointeur. Maintenant, ajoutez P comme spécificateur de
format. Et p N représente ici la barre oblique de
pointeur n. Et après cela, vous pouvez ajouter l'
adresse d'une instance ECS. Vous pouvez ajouter PTR, les deux fonctionnent. Nous allons maintenant ajouter
l'adresse de x. Afin d'éviter que
l'annonce ne soit correcte, nous devons la rejeter comme nulle. Maintenant, lançons ça pour
voir comment les choses vont se passer. Alors ouvrez le dossier contenant, enregistrez d'
abord ce fichier. Appelons ça un élément pointeur. Voyons voir. Après cela,
combinons ce pointeur. Nous allons d'abord utiliser ls, pointeur
GCC point c. Maintenant, trouvons un EXE. Et ici, nous avons
l'adresse PTR est 01, F, 1 quatrième. Nous pouvons maintenant exécuter cet incrément et ce décrément
pour voir comment les choses vont se passer. Ici, vous pouvez dire PTR
plus plus et PTR moins moins. Maintenant, vous remarquerez que si
nous le remplacons par PTR, essayons d'exécuter les codes. Comme vous pouvez le constater, nous
obtenons les mêmes résultats. Maintenant. Imprimons la même chose
après les incréments, puis imprimons la même
chose après les deux-points. Maintenant, l'
incrément va incrémenter l'adresse de quatre, soit le nombre d'
octets et un entier. Ensuite, il le récupérera de
quatre en utilisant le décrément. Voyons donc comment les choses vont se passer. J'y retourne.
Combinons en utilisant GCC. Allons courir. Le voilà. Maintenant, comme vous pouvez
le voir ici, 61 E14. Après avoir incrémenté de
quatre octets, c'est 18. Maintenant, j'ai
encore décrémenté la valeur, PDR moins moins. Maintenant, il revient à un pour une
augmentation de quatre octets, puis diminuée de quatre barres. Allez donc à l'emplacement d'origine. Encore une fois, PTR, augmentent et diminuent
selon le type de point. Maintenant, nous pouvons
le changer en caractère. Maintenant, si nous revenons ici, essayons de combiner. Maintenant, comme vous pouvez le voir, cet acteur n'est qu'un octet. Maintenant, il est à 17 en l'
incrémentant à 18 ans. Et en décrémentant
encore craché le 17. Comme vous pouvez le constater, l'incrément et le
décrément se produisent au niveau des octets en
fonction du type de données. Et c'est l'incrémentation
et la décrémentation de l'adresse. Ce n'est pas la valeur. Merci d'avoir regardé cette leçon. Si vous avez des questions, je suis là pour vous aider.
6. 7 conseils d'ajout et de soustraction: Bonjour et
bienvenue dans cette nouvelle leçon dans laquelle nous allons
parler d' ajout et de
soustraction sur les pointeurs. Maintenant, pour soustraire la
valeur du pointeur, définissons d'abord
un nouveau pointeur. Nous allons donc ajouter x égal à dix. Et cela crée un pointeur. Pointons ce pointeur
vers l'adresse de x. Maintenant, comme dans notre exemple précédent, nous les définissons et nous allons effectuer
des opérations à ce sujet. La première étape consiste à
soustraire du pointeur pour
soustraire la valeur du pointeur. Ptr est égal à PTR moins,
disons quatre. Parce que nous avons
affaire à un entier. Voici l'hypothèse que l'
entier est de quatre octets. Mais vous pouvez soustraire n'importe quelle valeur. Maintenant, une fois que vous exécutez
cette commande, si nous supposons que l'
adresse PTR est 1000, maintenant elle deviendra 960 ou 84, désolé, car nous avons quatre octets et quatre
sur quatre est 16 bits. Nous sommes donc retournés en arrière 16 bits. Maintenant, c'est à ce moment qu'il
s'agit du niveau des bits. Maintenant, pour rendre les choses plus
claires, imprimons. Merci. Donc, imprimez f, adresse, valeur, le pourcentage
de couture et de coupe oblique. Nous voulons maintenant
imprimer la valeur PTR. Nous devons le jeter. Ensuite, nous pourrons ajouter B2. Maintenant, pour imprimer la valeur après
en avoir soustrait quatre. Revenons en arrière et
exécutons ça. Alors, économisez. C'est le nom de notre fichier. Nous allons donc copier le nom. Maintenant. Lançons ce code. Maintenant, le compilateur GCC E. Et nous l'avons ici. Comme vous pouvez le voir ici. La valeur avant la
soustraction est B14. Maintenant, la valeur après la première
soustraction, soustraction est 04. Et ici, nous y sommes retournés. Comme vous pouvez le constater, nous en avons
soustrait quatre. Maintenant, sachez exactement
combien de pas nous avons reculé. Allons en soustraire un. Maintenant, enregistrez
à nouveau ce code, revenez en arrière, combinez-le et exécutez le code. Maintenant, comme vous pouvez le constater,
lorsque nous en avons soustrait un, nous sommes passés de 14 à dix. Nous avons reculé quatre étapes. Maintenant, si nous en avons soustrait quatre, nous allons revenir en arrière 16 étapes. Maintenant, une autre chose
que vous pouvez faire avec pointeurs est de soustraire le
pointeur du pointeur. Créons donc une autre
variable. Appelons ça Y. Et créons
un autre pointeur. Appelons
celui-ci et cet outil. Et modifions
les valeurs x et y. Beta1, beta2. Ici, nous avons PTR un, et ici nous avons le PTR C2. Maintenant, ce que nous devons
faire, c'est ce qui suit. Nous allons créer int x
égal R1 moins PTR à. Nous supposons ici que
nous avons deux indications. Et les deux sont des
pointeurs vers un entier, qui est de quatre octets. Maintenant, PTR un moins bêta deux renverra le nombre
de pas entre eux. Alors, faisons-le. Et la dernière étape consiste à imprimer. Le résultat est le
pourcentage d barre oblique n. Et n. Ici, nous
devons ajouter x sur x. Maintenant, revenons
à la ligne de commande. Maintenant. Nous avons des problèmes ici. X est à nouveau défini, donc nous devons le faire. Maintenant, comme vous pouvez le voir ici, nous avons un point ou un autre. Nous avons des pointeurs à aborder. Et nous avons soustrait le pointeur d'
un outil de pointeur de cadre. Et nous avons découvert que l'espace entre eux est ce numéro. Maintenant, lorsqu'il s'agit de
l'ajout de pointeurs, nous pouvons ajouter une valeur à un pointeur. Pour ce faire, nous pouvons
simplement procéder comme suit. Nous pouvons dire que PTR V1 est égal à
V2 R1 et disons quatre. Et nous pouvons
l'imprimer à l'aide de la commande print
que nous avons tous utilisée. R1, vide B à R1. D'accord ? Maintenant, nous savons déjà que nous avons sur d'autres
seront imprimés ici. Voyons donc comment cela
affectera le résultat. Maintenant, modifiez EXP. Et nous y voilà. Il s'agit de l'adresse PT R1. Et c'est l'
adresse après avoir ajouté quatre à la valeur PT R1. Comme vous pouvez le constater, il
passe de 08 à 18 ans. Et c'est de cela que
nous parlons. Vous pouvez facilement ajouter ou soustraire des valeurs en fonction
du type d'opération. Maintenant, la chose qui n'est
pas autorisée, c'est pourquoi il est interdit d'ajouter
un pointeur à un pointeur
comme celui, comme, de
les soustraire ici. Ce n'est pas autorisé, et cela
entraînera une erreur du compilateur. Si vous essayez d'ajouter un point à
1 ou deux avec un signe plus, vous obtiendrez une erreur de
compilation. Il est donc uniquement permis d'ajouter
une valeur au pointeur. Il n'est pas permis d'ajouter
deux pointeurs ensemble. Mais vous pouvez soustraire la
valeur d'un pointeur, ou vous pouvez soustraire deux
pointeurs l'un de l'autre. C'est tout pour cette leçon. Si vous avez des questions veuillez poser la question et si
vous faites partie du tableau.
7. 8 conseils et tableaux: Bonjour et bienvenue dans cette
nouvelle leçon dans laquelle nous
allons parler de
tableaux et de fonctions. Maintenant, la première chose à savoir
est que le nom du tableau est l'adresse
du premier élément qu'il contient. Donc, si nous avons enregistré et ARR, qui est un tableau
comportant dix éléments, alors c'est l'
adresse de la SE, du premier élément et du
tableau qui est l'élément 0. C'est exactement comme dire
à risque d'avoir tous 0. Ces deux-là sont identiques. Par conséquent, la définition d'un tableau à
l'aide de cette méthode signifie que nous pointons vers l'adresse du premier
élément du tableau. Désormais, tous les éléments du tableau sont enregistrés séquentiellement
dans la mémoire. Ce qui signifie que si vous
avez un pointeur le premier élément
du tableau, incrémentation du pointeur
fait le ou les pointer vers le deuxième élément et continuez à l'
incrémenter pour atteindre le troisième, quatrième, cinquième, etc. Maintenant, une autre bonne
chose à savoir est que le fait de traiter le
tableau et le fait que les données animales
sont l'adresse de leur premier élément
nous permet de faire beaucoup de choses à l'aide de tableaux en les
utilisant comme pointeurs. Ici encore, ARR est
identique à l'adresse 0. Ce qui signifie que si vous
transmettez le nom de tableau ARR à la fonction appelée,
disons fonction. Donc, fonctionne. Et nous le donnons. Dans ce cas, nous passons l'adresse. Nous ne passons pas de valeur. Ce
prototype de fonction doit donc être déclaré comme fonction de suivi
void. Et ici, nous devons nous assurer que nous ajoutons un pointeur. Nous ne passons pas par valeur. Nous passons la tarte Alice, même si nous écrivons, nous n'écrivons rien qui indique qu'il
s'agit d'un pointeur. Mais comme nous l'avons déjà mentionné, c'est le nom de notre tableau. Et le nom du
tableau correspond essentiellement l'adresse du premier
élément du tableau. Et cela arrive beaucoup,
une question de QCM et des entretiens et dans
de nombreux scénarios différents. Maintenant, dans la fonction, lorsque nous voulons déréférencer PTR, qui est le pointeur. Cela signifie que nous accédons au premier
élément du tableau. Et si nous l'avons fait, nous avons augmenté le PTR d'un. Ensuite, nous accédons au
deuxième élément de ce tableau. B à R. Two est le troisième
élément, et ainsi de suite. Vous devez vous assurer de garder
ces notes à l'esprit
lorsque vous traitez des tableaux à l'intérieur de C. Parce que les
tableaux ressemblent
beaucoup à des pointeurs, et la compréhension des pointeurs
permettra de
traiter le tableau sont
beaucoup plus faciles à accomplir. Maintenant, une autre remarque importante est que TR en indice et opérateur de
déréférencement lorsqu'il s'agit pointeurs et de tableaux. Maintenant, l'opérateur en indice, qui est ces deux signes, a été utilisé avec des tableaux lorsque
nous définissons un nouveau tableau. Il peut également être utilisé
avec des pointeurs. Disons donc que
nous avons un pointeur. Commentons donc. OK. Disons que nous
avons un pointeur, PTR. Maintenant, quand on dit PTR 0, en utilisant cet opérateur d'indice, cela signifie la même chose que dire, de
beaux détails de danse. Ces deux-là sont identiques. Nous appelons le premier élément ou la première adresse
du pointeur. Maintenant, lorsque nous voulons accéder à la deuxième adresse après
l'adresse du pointeur, nous pouvons simplement écrire PTR une. Et puis, dans ce cas,
nous accédons l'adresse à côté de
cette première adresse PTR. Et c'est la même chose que
maintenant PTR un ici est la même chose que le déréférencement
PTR blas un. Et le PTR dix, par exemple, revient à déréférencer le
PTR qui en avait perdu dix. Et c'est là le point principal ici. Nous pouvons utiliser les deux indices. Opérateur avec pointeurs, tout comme les tableaux pour atteindre ou
trouver un élément exact. Maintenant, pour rendre les choses encore
plus claires, pourquoi pas ? Nous essayons cela avec un exemple
pratique. Enlevons tout ça. Maintenant. Tout d'abord, je vais définir une fonction. Et comme la plupart d'entre vous le savent, pour définir une fonction,
nous devons d'abord appeler le prototype
ou initier un prototype. Ensuite, nous devons implémenter la fonction, l'implémentation de la
fonction. Ensuite, nous devons l'appeler. Commençons donc par le prototype.
Disons que c'est amusant. Et ici et un astérisque PTR. Cette fonction prendra donc PTR ou pointeur comme entrée
et ne renvoie rien. Maintenant, trouvons l'implémentation de la
fonction. Retirez ceci, ajoutez
deux accolades bouclées. Ici. Nous devons ajouter une boucle for. À l'intérieur de cette boucle pour la boucle
va passer de 0 à, disons, dix je plus plus. Et ici, nous
devons ajouter print f. et ici, nous
devons imprimer les valeurs. Et nous serions trop durs. Mais au lieu de
combattre seul PTR, nous utiliserons le TR en indice et nous ajouterons tout comme avec les tableaux. Après cela, nous
pouvons appeler la fonction. Maintenant, voici l'astuce. Lorsque nous appelons
la fonction, nous ne passons pas, disons une valeur, nous passons une adresse car, comme vous pouvez le constater dans
l'implémentation de la fonction, nous recevons un pointeur. Créons maintenant un tableau
et ARR puis égaux, et donnons-lui dix valeurs. Donc 12345678910. Maintenant, pour transmettre une
adresse à cette fonction, nous pouvons le faire en utilisant le tableau. Comme nous l'avons déjà mentionné. Nous avons déjà mentionné que
le tableau ou le tableau de dix est fondamentalement la même chose que l'appel du premier
élément à l'intérieur de ce tableau. Donc, pour appeler l'adresse du
premier élément, nous devons la transmettre en utilisant ARR sans
rien écrire d'autre. Maintenant, cela permettra de
s'assurer que le funk recevra l'adresse
du premier élément. Et cela augmentera
cette adresse d'
une en utilisant un
indice PTR ici. Il va donc passer
du premier élément au dernier élément et
le
verra en action. Sauvons ça et revenons en arrière. Maintenant, les baies GCC, les pointeurs. Voyons voir. Maintenant, comme vous pouvez le constater, nous avons un problème ici, que
je n'ai pas été défini. Définissons-le donc. Une fois encore. Maintenant. Comme vous pouvez le constater, nous venons d'
imprimer le tableau sans avoir à transmettre la
valeur de ce tableau. 12345678910. Et nous ne passons l'adresse du premier
élément de ce tableau. Nous utilisons
l'opérateur d'indice de pointeur pour parcourir ce tableau en
passant simplement d'une adresse à l'autre, à l'autre en
augmentant une, le PTR utilisant ce diesel
ou l'opérateur d'indice. Je sais que les choses peuvent être un peu déroutantes
à ce stade, mais avec cet exemple, vous devez
revenir rapidement sur cet exemple. Essayez de regarder cette leçon
plus d'une fois
afin de digérer les
informations qu'elle contient. Faisons maintenant un bref résumé. Le nom du tableau correspond l'adresse de son
premier élément. Donc, si nous avons ce tableau
, ARR est l'
adresse du tableau 0. Maintenant, si vous transmettez le nom du tableau ou similaire dans ce cas
à cette fonction, vous transmettez
l'adresse à la fin. La fonction.
Le prototype doit être déclaré avec un
pointeur en entrée. Maintenant, à l'intérieur de la fonction func, lorsque nous déréférençons PTR
, nous accédons au
premier élément du tableau. Et nous pouvons accéder
au premier élément en écrivant PDR, dernier pour accéder
au second élément. Ou nous pouvons simplement utiliser PTR. Et ici, nous utilisons un
indice ou pour I. Et nous commençons par le
premier élément abordé. Ensuite, le deuxième élément, le troisième élément ajoute. Et je dis ici que je le ferais simplement, parce que nous avons affaire
à des adresses, nous ne traitons pas de valeurs, parce que nous venons de
recevoir
l'adresse du premier élément et nous
sommes en boucle à travers
les adresses. Et nous imprimons
la valeur que ces adresses pointent. C'est ça. Ce n'est pas
un exemple facile, je sais. Mais encore une fois, les opérateurs
ou disons que les
pointeurs ne sont pas une chose
facile à apprendre. C'est pourquoi vous devez
regarder cette leçon plus d' une fois afin de digérer
les informations qu'elle contient. Si vous avez des questions ou si quelque chose n'est pas clair
dans cette leçon, demandez à la mandibule, je serai ravi de vous aider. Merci d'avoir regardé.
8. 9 conseils vides et nul: Bonjour et
bienvenue dans cette nouvelle leçon dans laquelle nous allons
parler de pointeur suspendu
et de pointeurs sauvages. Un pointeur suspendu pointe vers une adresse mémoire qui
contenait autrefois une valeur. Étant donné que l'adresse qu'il pointe
n'est plus conservée, son
utilisation aboutira à
un résultat attendu. Donc, afin de voir
cela en action. Maintenant, ici, la première
étape consiste à créer un pointeur. Donc, un Astérix PTR. Maintenant, ce que nous devons faire, c'est
d'utiliser la fonction malloc. Cette fonction malloc
renverra nulle. Nous devons donc passer
en astérisque entier, qui est le pointeur
sur entier pour convertir le pointeur vide
en pointeur entier. Alors revenez ici
et écrivez un entier, qui est essentiellement
un pointeur entier. Continuez maintenant avec le
modèle et nous
devons appeler la taille de la fonction. Et nous allons résoudre la taille
de l'entier à l'intérieur ici. Après cela, nous
créerons une variable, appellerons une variable et la
rendrons égale à 560. Ensuite, nous devons faire le point ou les points
à l'adresse d'un , puis nous utiliserons
cette fonction libre. La fonction va simplement
délocaliser la mémoire. C'est vrai, soyez PTR. C'est ça. Maintenant, nous avons libéré ce pointeur. Nous avons déjà mentionné que le pointeur
suspendu pointe vers une adresse mémoire
utilisée pour contenir la variable. Comme l'adresse qu'il pointe
n'est plus réservée, son
utilisation entraînera des résultats
inattendus. Maintenant, pour vous montrer le résultat
inattendu, nous pouvons procéder comme suit. Nous avons procédé à l'attribution du PTR. Nous pouvons donc écrire un PTR égal à
cinq pour en stocker cinq dans ce
magnétoscope de déréférencement, qui est un. Et la dernière étape consiste à imprimer. Donc imprimer f. Et ici, nous utiliserons pourcentage d pour planifier
la référence du PTR. Maintenant, sauvegardons le code. Et ici, nous testons
le pointeur suspendu. Alors revenez en arrière, CLS, GCC. Ok, maintenant vous voyez des pointeurs
suspendus. Maintenant, nous avons un problème. Nous avons oublié d'inclure un CD en direct. Nous allons donc l'inclure. J'ai sauvegardé le code et revenez en arrière. Une fois encore. Nous y voilà. Comme
vous pouvez le voir ici, nous avons compilé ce code. Maintenant, lançons un EXE. Et comme vous pouvez le voir,
il clignote. Maintenant, nous n'avons rien
reçu. Il aurait dû imprimer ces
différents fronts du PTR. Mais comme nous l'avons déjà mentionné,
nous avons décalé le PTR. Il s'agit donc d'un
pointeur suspendu et son utilisation après l'allocation entraînera des résultats
inattendus. C'est ce qu'est un pointeur
suspendu. Encore une fois, un
pointeur suspendu est un pointeur qui pointe vers la suppression
ou les objets alloués. Et vous devez vous
assurer que vous ne retracez pas de tels scénarios. Et essayez de les éviter. Essayez de ne pas jouer avec des pointeurs. Ils les attribuent ou
les suppriment sans savoir
ce que vous faites. Maintenant, le deuxième type de
pointeurs est celui des pointeurs sauvages. Maintenant, commentons cette partie. Tandis que le pointeur
est un pointeur utilisé avant l'initialisation. Un exemple de cela
est le PTR de fin. Si nous utilisons l'instruction print
f et essayons d' imprimer le PTR
à l'aide
du PTR de déréférencement. Nous n'avons pas encore initialisé
le PTR avec une adresse. C'est donc ce qu'on appelle
un pointeur de temps. Maintenant, enregistrez vos codes, revenez en arrière et combinez, puis lancez. Comme vous pouvez le constater, encore une fois, un résultat inattendu, car
c'est notre pointeur. Nous n'avons pas initialisé
ce pointeur. Et c'est pourquoi nous
sommes confrontés à cela. Maintenant. Aucune flèche n'a été dessinée, mais nous n'avons reçu
aucun résultat car. Ce pointeur n'a pas été
initialisé au début. Maintenant, comment transformer un
pointeur valide en un autre ? Alors, pendant le pointeur, c'est facile. Comme vous pouvez le constater, nous avons déjà créé le pointeur, nous devons
donc le
pointer vers quelque chose. Nous pouvons l'initialiser en
créant simplement un autre entier, appelant, en lui attribuant une valeur de dix. Ensuite, nous dirons que PTR
sera égal à l'adresse de x. C'est tout. Et maintenant, nous pouvons réexécuter
ce code. Comme vous pouvez le voir, nous en avons obtenu cinq, ce qui est la valeur de x. Et maintenant ce n'est pas
un pointeur sauvage. Nous avons donc dû initialiser le pointeur pour qu'il
ne soit pas un pointeur sauvage. Et c'est essentiellement
comme ça que ça se passe. Commentons donc cette partie et parlons d'
un autre type de pointeurs, qui est un pointeur nul. Maintenant, pour nous assurer
que nous n'avons pas notre point de terminaison ou que nous pouvons initialiser
un pointeur avec analogie, ce qui en fait un pointeur nul. Le moyen le plus simple de le faire
est de copier simplement ce PTR asic final, qui est l'
initialisation du pointeur. Et ensuite, vous comptez les
bonnes connaissances. C'est ça. C'est ce qu'on appelle un pointeur nul. Maintenant, nous pouvons également
imprimer ce pointeur. Mains. Vous pouvez voir
maintenant que nous jouons, imprimons, mais
il n'imprime rien, car il s'agit d'un
pointeur nul et d'un pointeur vide. pointeur Null pointe sur
rien ou sur une adresse mémoire à laquelle les utilisateurs ne peuvent pas accéder. Donc, dans ce cas, c'est ce
qu'on appelle un vieux pointeur. Appelons donc ce vin. Appelons cela suspendu, et appelons
ce pointeur nul. Maintenant, un autre type de pointeur
est le pointeur de vide. Un pointeur vide peut être utilisé pour
pointer vers une variable
de n'importe quel type de données. Il peut être réutilisé pour pointer vers
n'importe quel type de données que nous voulons. Et il est
facilement déclaré en écrivant un point
d'astérite vide
ou PTR est égal à nul. C'est ce qu'on appelle un pointeur de vide, car ils sont de nature très
générale, ils sont également connus
sous le nom de pointeurs génériques. Grâce à leur flexibilité, les pointeurs de
vide entraînent également certaines contraintes. Les pointeurs de vide ne peuvent pas être déréférencés comme
n'importe quel autre pointeur. Maintenant, si vous essayez de
déréférencer un pointeur de vide, vous serez confronté à une erreur. Si vous souhaitez effectuer des opérations
arithmétiques
sur des pointeurs de vide, vous
devez
taper ces pointeurs. Maintenant, le typecasting est fondamentalement un autre sujet et nous n'
allons pas le couvrir ici. Mais vous devez le typer si vous voulez l'utiliser
et des opérations arithmétiques, annuler les pointeurs
des grandes fonctions de bibliothèque Hughes et C
telles que malloc et calloc, qui allouent de façon spectaculaire la mémoire a renvoyé des pointeurs de vide. Il y a aussi la source de teinte
et la fonction de tri intégrée en C qui a une fonction
comme argument, qui prend elle-même des
pointeurs de vide comme argument. Maintenant, ils viennent surtout
le pointeur vide, le pointeur nul, le pointeur sauvage et le pointeur suspendu viennent
généralement entrevue
et les questions du QCM. Vous devez donc vous assurer
que toutes
ces inflammations sont
écrites dans
un carnet de ces inflammations sont
écrites dans notes afin de pouvoir les
examiner quand vous en avez besoin. Et vous n'avez pas à les
mémoriser tous, mais vous devez savoir exactement
ce que chacun d'entre eux fait. Maintenant, procédons à une révision rapide. Un pointeur suspendu. Le premier est un pointeur qui pointe vers le supprimer
ou l'objet alloué. Le pointeur sauvage, qui
est le second, est n'importe quel point ou
utilisé avant l'initialisation. Maintenant, pour que ce n'est pas un pointeur sauvage, nous pouvons le faire
en utilisant simplement le pointeur nul. Et le dernier de notre liste
s'appelle le pointeur vide, qui est un pointeur qui peut être
utilisé pour pointer vers une
variable de n'importe quel type de données. Il peut également être utilisé pour pointer vers
n'importe quel type de données que nous voulons utiliser. Il est déclaré simplement en
tapant vide avant le nom du pointeur et le signe astérix et en
lui donnant une valeur nulle. C'est tout pour cette leçon.
Merci d'avoir regardé.