char ** et pointeurs de déréférencement
Je voudrais terminer ma confusion avec le char **
Quand une fois crée un tableau de tableaux de caractères(strings) comment char **
fait accomplir cela?
- je obtenir char *
est un pointeur vers un char et que char *array[]
est un tableau de pointeurs de char, mais ce que fait exactement char **
faire et comment faut-il faire?
Aussi quand j'entends le mot déréférence ça me fait penser que le pointeur est supprimé quoi exactement déréférencer un pointeur veux dire? La modification de la valeur que le pointeur pointe vers?
Grâce
source d'informationauteur jarryd
Vous devez vous connecter pour publier un commentaire.
"Déréférencement" un pointeur signifie accéder à la valeur sur laquelle pointe le pointeur. Assumer les déclarations suivantes:
Voici une hypothétique carte mémoire de ces deux variables:
a
contient la valeur de l'entier 10.p
contient l'adresse dea
(0x80001000). Si nous voulons accéder au contenu dea
parp
nous de déréférencementp
avec l'opérateur d'indirection*
. Ainsi, l'expression*p
est équivalente à l'expressiona
. Si nous avons écritqui est la même que l'écriture
Voici un court extrait de code montrant comment utiliser un objet de type
char **
pour créer un tableau de chaînes de caractères:Aller ligne par ligne,
alloue un bloc de N éléments, chacun assez grand pour stocker un pointeur sur char (
sizeof *arr
==sizeof (char *)
etant donné que le type de*arr
==char *
), et affecte le pointeur résultant de la valeur àarr
. OIE,arr
points pour le premier pointeur dechar
d'où le typechar **
. Notez que si vous vous êtes séparé de la déclaration et l'appel de la fonction, il ressemblerait àNous voulons affecter le résultat de
malloc
àarr
pas à ce quearr
points de.Il est possible pour
malloc
à l'échec, de sorte que nous voulons vérifier le résultat avant de l'utiliser. Dans le casmalloc
échoue, il sera de retour d'une valeur de pointeur NULL.Pour chaque pointeur de caractère
arr[i]
nous allouer un bloc de mémoire suffisamment grande pour la LONGUEUR+1 éléments, chacun assez grand pour contenir unchar
valeur (sizeof *arr[i] == sizeof (char)
depuis le type de*arr[i] == char
; note quesizeof (char)
est toujours 1) et d'affecter le résultat dearr[i]
.Puisque nous allouer chaque chaîne avec un
malloc
appel, il est peu probable qu'ils sont contigus en mémoire. Voici une autre carte mémoire montrant un possible résultat du code ci-dessus:Un pointeur est un type qui est titulaire d'une adresse à une valeur, au lieu de la tenue de la valeur réelle.
Ainsi, dans le cas de char *p, une fois attribuées, p doit contenir une adresse A. Déréférencement du pointeur signifie accéder à la valeur stockée à l'adresse A. La raison pour laquelle vous pouvez stocker des chaînes de caractères dans un char *, c'est parce mémoire allouée est contiguë. Donc, A est une adresse qui stocke le premier caractère, Un+1 est une adresse qui stocke le deuxième caractère, et ainsi de suite.
Dans le cas de char **pp, il stocke l'adresse d'un char *. Appeler cette adresse B. Donc, de déférence pp signifie accéder à la valeur à l'adresse B, qui se trouve être un char *, qui arrive à tenir une chaîne de caractères. De la même manière, B+1 (en fait B + sizeof (char *)) stocke la valeur suivante, qui est une autre chaîne de caractères.
Déréférencement pp deux fois (ie **pp) signifie que vous êtes d'abord accéder à la valeur à l'adresse B, qui, par exemple, est Un, et puis de déférence qu'une fois de plus pour obtenir la valeur à l'adresse de A, qui est de certains personnages.
Schémas valent 1000 mots. Jetez un oeil ici
char, char* et char** sont simplement des types de décrire ce qu'est une variable (zone de la mémoire) contient.
À l'aide de déférence, comme *variable effectivement dit de traiter la valeur de la variable comme une adresse de mémoire et fait retourner la valeur à cette adresse. C'est d'indirection.
**variable est tout simplement deux niveaux d'indirection. c'est à dire la valeur de la variable est une adresse en mémoire d'une autre adresse mémoire de la mémoire de données qui sera retourné.
Adresses viennent généralement à l'adresse de l'exploitant, la
&
ou à partir d'une fonction d'allocation mémoire/opérateur commenew
Déréférencement d'un pointeur signifie accéder à la valeur du pointeur points. Par exemple,
La raison pour laquelle vous utilisez un pointeur vers c au lieu de c directement est qu'un pointeur vous permet d'accéder à plus de 1 valeur. Prenez cet exemple:
Maintenant, supposons que nous avons besoin de la deuxième personnage. Nous avons pu y accéder avec
c1
. Mais comme vous pouvez le voir, cette notation est vraiment lourd. De Plus, si nous lisons la chaîne dans un fichier au lieu de l'écrire, nous aurions à faire des choses compliquées. Au lieu de cela, nous venons d'écrireNoter que le premier élément a la indice 0, le deuxième 1 - c'est pourquoi nous sommes à l'aide de 1 ici. Un
char**
transforme ce jusqu'à onze, nous avons un tableau d'un tableau de caractères. Supposons que nous avons un tel tableau, nous allons l'appelerinput
et ont besoin de trouver la longueur de toutes les chaînes. C'est la manière dont nous le faisons: