Bonjour et bienvenue à nouveau. Maintenant que nous comprenons un peu plus les pointeurs
en détail, je veux parler des pointeurs de caractères, principalement de
la façon dont vous pouvez utiliser des pointeurs de caractères pour représenter des chaînes.
Les chaînes sont des tableaux de caractères, plusieurs caractères, des mots.
Nous savons donc maintenant comment les tableaux se rapportent aux pointeurs dans le concept d'arithmétique des pointeurs.
Concept très, très utile.
Ces concepts peuvent être très utiles lorsqu'ils sont appliqués aux
chaînes de tableaux de caractères, car nous pouvons désormais facilement parcourir une chaîne caractère par caractère.
L'une des applications les plus courantes de l'utilisation d'un pointeur vers un tableau est en
tant que pointeur vers une chaîne de caractères.
Les raisons en sont une de commodité et d'efficacité de notation.
Donc, utiliser une variable de type pointeur vers char pour référencer
une chaîne vous donne beaucoup de flexibilité.
Vous allez donc essayer d'utiliser autant
que possible des pointeurs de caractères sur des
tableaux de caractères, en utilisant spécifiquement des pointeurs de caractères pour transmettre des données à une fonction.
Toutes sortes de belles choses comme ça.
Regardons donc un exemple qui utilise un tableau pour copier une chaîne.
Dans cet exemple, notre paramètre de tableau va être un tableau de caractères.
Vous le verrez directement dans la déclaration de fonction.
Je veux comparer cela à une fonction qui prend un pointeur de
caractère et vous montrer comment la fonction de pointeur de caractère est beaucoup plus efficace.
Donc, dans cet exemple, nous avons deux fonctions,
une qui prend un tableau et une
qui prend des pointeurs.
Dans la première chaîne de copie de
fonction, nous pouvons parcourir tout le tableau en utilisant une boucle for I égale zéro à partir
du sous-I et nous allons jusqu'au bout jusqu'à ce que nous voyions la chaîne de caractères
nulle, puis nous incrémentons notre variable de contrôle de boucle.
Et puis tout ce que vous avez à faire est de dire que 2 sous I est égal à sous I. Nous faisons une mission
directe là-bas.
Et puis à la toute fin, après avoir parcouru tout le chemin jusqu'à ce que nous
voyions un caractère nul, nous ajoutons un caractère nul à la fin
de notre tableau to, assez basique. Voyons maintenant comment nous procédons lorsque nous utilisons des pointeurs.
Tout d'abord, nous déclarons aux pointeurs comme déclaration de fonction dans la chaîne de
copie en disant simplement char star to char start from.
Dans notre boucle for, nous n'avons pas à déclarer de
variables car nous avons des pointeurs et nous
voulons juste itérer jusqu'à ce que from atteigne le terminateur nul.
Et puis nous pouvons incrémenter à la fois les pointeurs from et to.
Parce qu'ici, nous faisons de l'arithmétique des points.
Nous ajoutons simplement un au pointeur qui augmente son adresse de un, ce qui
obtient le caractère suivant.
Et la prochaine ligne de boucle for que nous
déréférencerons à la fois vers et depuis parce que
nous voulons attribuer la valeur réelle vers laquelle pointe le
pointeur, le caractère réel au pointeur to.
Et puis à la toute fin, nous ajoutons
le caractère nul à l'endroit où le pointeur to pointe vers
lequel se trouverait à la fin de la dernière adresse de la chaîne pour from
mais pointant maintenant dans l'adresse to.
Ça n'a pas l'air trop mal. Je veux dire que vous avez une boucle for.
Vous avez essentiellement le même nombre de lignes de code.
Mais vous voyez la différence de syntaxe.
Vous n'utilisez pas d'indices et vous utilisez des pointeurs, utilisez l'astérisque.
Encore une fois, c'est vraiment une question de commodité de notation.
Vous ne voyez pas un grand avantage ici.
Mais vous pouvez en fait optimiser davantage cela pour
même réduire le code lorsque vous utilisez les pointeurs.
Donc, si vous avez un tableau
de caractères comme pointeur, si vous avez un tableau de caractères appelé texte, vous
pouvez également définir un pointeur vers celui-ci et utiliser les éléments du texte.
Donc, ici, nous pourrions dire pointeur de texte
char star, c'est ainsi que vous définissez un pointeur de caractère.
Si le pointeur de texte pointe vers le début du tableau de
caractères appelé texte, vous pouvez simplement l'incrémenter
de un à l'aide de ces opérateurs de pré et post implémentation et de décrémentation.
Donc, ci-dessus, ce pointeur de texte plus plus va définir le pointeur de texte pointant
vers le caractère suivant dans le texte, qui est le sous-texte 1.
Donc, si nous voulons regarder dans le rayon suivant comme pour les entiers,
tout ce que nous avons à faire est d'ajouter 1 2 et nous pouvons obtenir le caractère suivant.
C'est beaucoup plus utile dans les tableaux
de caractères car vous pouvez facilement manipuler les caractères un par un.
Si vous faites un pointeur de texte moins moins, qui est l'opérateur de décrémentation, cela
définira le pointeur sur le caractère précédent dans le texte en supposant
que le pointeur de texte ne pointait pas le début du texte.
Parce que si c'était le cas, vous aurez ces erreurs sous limites.
S'il faisait un plus à la fin de la chaîne, vous auriez une erreur hors limites.
Vous devez toujours faire attention, tout comme une arithmétique entière, à ne pas dépasser les limites d'un tableau.
Mais très simple, cela se rapporte très étroitement au moment où vous faites de l'arithmétique
avec un pointeur entier.
L'arithmétique des pointeurs de caractères est la même chose.
C'est encore plus utile car vous pouvez désormais regarder des caractères individuels sans utiliser d'indice.
Donc, si nous regardons cet exemple précédent et
que nous pouvons en fait l'optimiser un peu plus en utilisant des pointeurs pour en
faire encore moins de lignes de code.
Alors maintenant, dans notre chaîne de copie, nous faisons cette déclaration de fonction est la même
qu'avant, créons quelques pointeurs en utilisant l'astérisque.
Mais nous n'utilisons plus une boucle for car il était un peu
inutile d'utiliser une boucle for dans l'exemple précédent
car nous n'avions pas réellement besoin d'initialiser la variable de contrôle de boucle.
Tout ce que nous avions à faire était de quitter
une boucle sur une condition, puis nous utilisons en fait les opérateurs d'incrémentation et de décrémentation
dans la boucle for, mais nous n'avons même pas besoin de le faire.
Cela devient en fait beaucoup plus simple ici car si nous utilisons une boucle while, tout
ce que nous avons à faire est de regarder la boucle while et
elle sautera si elle pointe vers un caractère nul car le caractère nul est en
fait égal à zéro.
Et la boucle while se souvient que les booléens
en c sont représentés par des entiers, un est vrai et alors
zéro est faux ou vraiment zéro est faux et puis tout le reste est vrai.
Dans ce cas, le caractère nul 0 qui est faux, ça va sauter.
Donc, tout ce que vous avez à faire pour la condition de sortie dans la boucle while est de mettre un astérisque de.
Qu'est-ce que cela fait, c'est déréférencer pour voir quelle est la valeur de ce personnage.
Donc, quand nous sommes à la fin de la chaîne que nous voulons copier, nous sautons.
Sinon, nous avons simplement mis notre modification
de nos pointeurs juste là, deux plus plus de plus plus.
Il s'agit maintenant d'un opérateur de post-incrémentation.
Donc, ce que cela signifie, c'est que le plus plus se trouve sur le côté droit de la variable.
Et lorsque vous faites cela, cela signifie
que vous ne l'ajoutez pas avant la fin de l'instruction.
Donc, ce que cela va faire, cela va dire que l'étoile 2 est égale à partir de.
Et puis, après que cette déclaration soit faite, il va s'ajouter à 2 1 et il va s'ajouter à partir de 1.
Si vous aviez le plus plus avant le nom de
la variable, cela ajouterait à cette variable avant d'exécuter cette instruction et ce
serait un problème car nous manquerions essentiellement le premier élément copié
dans la chaîne.
Mais nous n'avons plus besoin de lignes de code. Nous faisons une arithmétique et une affectation
de pointeur d'incrémentation dans la même instruction, nous réduisons
donc le code de un.
Encore une fois, la notation est très simple.
Nous faisons une affectation arithmétique entière très facilement.
Et puis à la fin, une fois que nous avons terminé,
copiant toutes les chaînes, nous ajoutons simplement
à la fin le caractère nul au pointeur que nous déréférencer car les deux sont en fait
la raison pour laquelle il passe par la boucle, il pointera vers le dernier personnage.
Donc c'est juste un peu nettoyé un peu ici.
Il vous montre la puissance des pointeurs et
comment vous pouvez utiliser les pointeurs et l'arithmétique dans les mêmes lignes et
avec ces opérateurs d'incrémentation et de décrémentation, ces plus plus et moins moins, cela le
rend encore plus rapide et plus facile, donc il est également plus efficace.
Si nous voulions utiliser ces fonctions de copie de chaîne, nous pourrions simplement créer deux tableaux de caractères.
Nous pouvons passer les tableaux de caractères directement à la chaîne de copie car les tableaux de caractères
0 sont des pointeurs.
Ce sont des pointeurs, nous n'avons donc pas à les dé-référencer ou à
ajouter des adresses ou quoi que ce soit. Nous pourrions simplement dire string2, string1.
Et donc, ce que cela va faire, c'est copier
une chaîne à copier dans le tableau de caractères string2,
puis l'imprimer à l'aide de printf.
Je voulais passer par un exemple de la façon dont vous pouvez utiliser
des pointeurs de caractères au lieu de tableaux de caractères et pourquoi ils sont parfois préférés.
Nous avons mentionné que c'est parfois la préférence du programmeur où si
vous avez programmé dans des langages précédents comme Fortran,
vous pouvez être utilisé pour augmenter. Mais si vous l'avez, vous
verrez les avantages de l'utilisation de pointeurs.
J'espère que cela a été utile. Merci.