Je sais que c'est très basique, mais c'est un peu déroutant pour moi.
J'ai lu:
Un pointeur
fort> n'est rien de plus qu'une adresse forte> et une variable de pointeur forte> est une variable qui peut stocker une adresse < / fort>.
Lorsque nous stockons l'adresse d'une variablei code> dans la variable de pointeur
p code>, nous disons que
p code> points sur strong> < code> i code>. p> blockquote>
xxx pré>
p code> Points sur
i code>. p>
pour accéder à l'objet qu'un pointeur Points à, nous utilisons l'opérateur
* code> (indirection). P>
Si
p code>
est un pointeur strud> alors * p code> représente l'objet à quel
p code> Points actuellement. p> BlockQuote>
Maintenant, je suis confondre que dois-je appeler
p code> - pointeur strong> ou
variable de pointeur strong>? p> Supplément: est un pointeur toujours identique à une adresse? em> strud> p> p> P>
6 Réponses :
Le jeton Déclaration: p> déclare aussi, remarque dans l'expression Un pointeur est juste une adresse logique (un identifiant par lequel une variable peut être référencée). La norme C ne définit pas ce qu'est un pointeur interne et comment cela fonctionne en interne. P> Vous souhaitez lire: Quel est exactement un pointeur C sinon une adresse mémoire? p code> est une variable de pointeur, qui pointe vers une variable
i code>. Nous pouvons simplement appeler cela un pointeur.
p code> comme identifiant d'un objet
int code> objet. Ceci est généralement indiqué plus succinctement que
P est un pointeur vers I ' code>.
P CODE> peut être utilisé pour renvoyer Int variable
i code> après l'expression
p = & i code>. Pour accéder à la valeur de la variable
i code> à l'aide du pointeur
p code> Vous pouvez utiliser l'opérateur de déséroférence
* code> (par exemple,
* p code>) . Et
i = 10; code> équivalent à
* p = 10; code>. p>
p = & i; code> pour lire l'adresse de
i code> i code> i utilisé
& code> ampersand opérateur également appelé
adresse de l'opérande code>. p>
De plus, lisez ceci: Pour comprendre le but des pointeurs. p> p>
Mais il est dit que Un pointeur n'est rien de plus qu'une adresse b>
Oui. Donne-moi un moment, je passe à travers ça.
@Accks votre accueil, oui Jonathon est un gars génial! J'ai lu beaucoup de ses réponses.
Le pointeur des termes et la variable de pointeur sont souvent utilisés de manière synonyme. p>
Une variable est un endroit pour stocker une valeur. Dans C, chaque fois que vous utilisez une variable dans un contexte nécessitant une valeur, la valeur de la variable est récupérée, de sorte que "P" dans ce contexte est la même chose que "la valeur de la variable p":
La différence entre une valeur de pointeur et une variable de pointeur est illustrée par: ici, Cependant, à plusieurs fins, la distinction est floue. Les gens diraient ' p2 code> est une variable de pointeur; C'est un pointeur de
int code>. D'autre part, dans l'appel à
swap_int () code>, l'argument
& v1 code> est une valeur de pointeur, mais il n'est en aucun cas une variable de pointeur (dans la fonction d'appel) . C'est un pointeur à une variable (et cette variable est
v1 code>), mais simplement écrire
& v1 code> ne crée pas une variable de pointeur. À l'intérieur de la fonction appelée, la valeur du pointeur
& v1 code> est attribuée à la variable de pointeur locale
i1 code> et la valeur de la variable de pointeur
p2 code> est attribué à la variable de pointeur locale
i2 code>, mais ce n'est pas la même chose que dire
& v1 code> est une variable de pointeur (car il n'est pas une variable de pointeur; c'est simplement une valeur de pointeur; ). P>
p2 code> est un pointeur "et c'est assez vrai; C'est une variable de pointeur et sa valeur est une valeur de pointeur et
* p2 code> est la valeur de l'objet que
p2 code> pointe vers. Vous obtenez le même flou avec '
v1 code> est un
int code>'; Il s'agit en fait d'une variable
int code> et sa valeur est une valeur
int code>. p> p>
Et Afaik, la norme n'utilise même pas la terminologie "variable" de toute façon.
@HACCKS non, quand j'écris "variable", je veux dire "variable".
@ H2co3; Ensuite, quelle terminologie utilisée en standard pour l'adresse mémoire?
@HACCKS "POINTER-TO-T", où "T" est un type. Et des "objets" sont utilisés pour les variables IIRC, mais vous pouvez vérifier la norme C actuelle ou précédente (C11 et C99, respectivement), elles sont disponibles gratuitement sur Internet.
@ h2co3; Hmmm. Donc, il vaut mieux dire Pointeur à taper i> à la place * pointeur sur variable / objet * Droite?
Laissez-nous Continuer cette discussion en chat
@Jonathan Leffler; Et aussi: est un pointeur toujours identique à une adresse? B>
Je dirais que oui: un pointeur valide est toujours l'adresse de certains objets ou fonction; Un pointeur nul n'est pas valide mais reconnaissable; D'autres pointeurs non valides sont dangereux à utiliser - même les lire sans la déséroférance que ceux-ci pourraient causer des problèmes sur certains systèmes (principalement de type mainframe) ».
@ H2CO3: Dans la section §5.1.2.3, un texte non normatif (exemple) indique la machine abstraite [DOIVER] Promouvoir la valeur de chaque variable à int code> et ajouter les deux < Code> int code> s et tronquez la somme. I> Il y a quelques autres références non normatives aux variables à la section 6 (la définition principale de la langue), mais le Spiel principal parvient à éviter le terme variable À l'exception des tableaux de longueur variable et des listes d'arguments variables, qui ne comptent pas.
Dans l'exemple que vous avez donné, vous avez attribué l'adresse de v1 code> à
p code>, ne devrait-il pas être l'adresse du
v2 code> car nous échangeons
V1 code> et
v2 code>?
Oui; Je vais aussi résoudre ça.
@Jonathanleffler oui, d'accord. C'est fondamentalement ce que je pensais. (Je n'ai pas insisté sur le fait que tout le document ne contenait pas le mot du tout, juste que le texte standard de base ne l'utilise pas pour décrire ces éléments avec des noms, des types et des valeurs.)
Remplacons le mot "pointeur" avec un type de données, j'espère plus familier, comme un ici 42 est un A Pointer em> est comme un numéro d'int: un nombre. Il s'agit d'un nombre qui identifie un emplacement de mémoire et, si quelque chose est stocké dans cet emplacement de mémoire, vous pouvez l'appeler une adresse em>. Comme un Int, un pointeur peut être stocké dans une variable. Une variable qui stocke un pointeur pourrait être appelée une variable de pointeur. P> donc, Quelle est la différence entre un pointeur et une variable de pointeur? STRUT> Le premier est une valeur, comme un nombre , la seconde stocke ces valeurs. Mais souvent, les gens se réfèrent à des variables par leurs valeurs qu'ils stockent; Les gens n'appellent pas examine maintenant le code suivant : p> La première ligne déclare une variable de pointeur appelée dans la deuxième ligne, nous prenons l'adresse de la variable Que pouvons-nous faire avec un pointeur? Nous pouvons lire et écrire à l'emplacement de la mémoire que le pointeur identifie. Pour ce faire, nous «Dréréférence» le pointeur avec le C'est à ce stade que cela devient évident pourquoi nous devons connaître le Type de données que Une autre raison pour laquelle il est important de connaître le type de données que int code>:
int Code> Valeur et
N code> est une variable qui contient un
int code>. Vous pouvez appeler
n code> un "
int code> variable". Un int est un nombre comme 42 ou -25315685, et une variable
int code> contient ces chiffres. Une fois que vous avez une variable, vous pouvez attribuer différents numéros. Rien de déroutant jusqu'à présent? P>
n code> un "
int code> variable" mais juste
int code>, même s'il peut à différents moments stocker différents
int < / code> s. Dans ce texte, je ferai de la même manière et parfois écrivez un pointeur lorsque je veux dire une variable de pointeur; Espérons que la distinction sera claire. p>
p code>. Les pointeurs qui peuvent être stockés dans
p code> sont des emplacements de mémoire pour
int code>; Ceci est important pour des raisons que nous verrons plus tard. Nous ne donnons toujours pas de
p code> n'importe quelle valeur, de sorte que le pointeur qu'il stocke est arbitraire. Cela ne stocke certainement pas l'adresse de quoi que ce soit utile; Il peut même signaler à une zone de mémoire inaccessible au programme. p>
n code> avec le
et code> -Opérateur et assignez-le à
p code>. Maintenant
p code> stocke l'adresse de
n code>, l'emplacement de la mémoire où la valeur de
n code> est stockée. P>
* code> -opérateur, puis
(* p) code> peut être utilisé comme vous pouvez utiliser
n code >. Par exemple, vous pouvez écrire une nouvelle valeur dans
n code> avec ceci: p>
p code> peut pointer sur: sinon, vous ne pouvez pas savoir ce que vous pouviez attribuer à
(* p) code>. P>
p code> peut pointer sur est pointeur arithmétique em>. Par exemple,
p + 1 code> est un pointeur sur le
int code> stocké en mémoire juste après
n code>; Si
p code> était un pointeur sur une grosse structure de données
p + 1 code> serait un pointeur sur une structure de données du même type stocké juste après elle. Pour cela, le compilateur doit connaître la taille de ce que le pointeur pointe vers. P> p>
Merci d'avoir expliqué un supplémentaire (mais je n'ai pas complètement reçu votre explication) +1.
Quelles parties avez-vous trouvé difficile à suivre?
Votre partie d'enquête est vraiment bonne et cela m'a aidé à comprendre de bons points, mais cela n'est pas spécifique à ma question; est un pointeur toujours une adresse? b>
Eh bien, cela dépendrait de ce que l'on entend par "adresse" mais je dirais non. Imaginez que vous écriviez un programme pour un ordinateur moderne: le programme demande au système d'exploitation de la mémoire. Les seules adresses valides sont pour la mémoire que le système d'exploitation est retourné, mais il existe de nombreuses autres valeurs que vous pouvez stocker dans un pointeur. Ou imaginez un système intégré sans système d'exploitation. Les seules adresses valides sont pour la mémoire réellement installée, ce qui est généralement une fraction du nombre de valeurs de pointeur distinctes. Un pointeur n'est pas toujours une adresse valide.
Pointeur: une variable dont la valeur est l'adresse d'une autre variable. P>
Variable du pointeur: est-ce qui contient l'emplacement ou l'adresse de la mémoire dans laquelle une autre variable, une autre valeur de données ou une fonction est stockée. P>
Vous avez probablement essayé de dire "Pointeur: adresse d'une autre variable".
lisant "Que signifie" la déséroférance "un pointeur?" peut être utile et de wiki: "" Pointeur (programmation informatique) "
@Grijeshchauhan; J'ai lu le premier lien avant de poser cette question :). Merci pour le deuxième lien.
@Grijeshchauhan; Merci pour le lien wiki. Cela explique la déséroférance d'une très belle façon. (En fait, cela a été ma prochaine question si vous n'avez pas fourni ce lien :)).
Habituellement, c'est une bonne idée (au moins comme un débutant) de diviser ces types de déclarations en plusieurs lignes. C'est
int i, * p = & i; code> est équivalent à
int i; code>
int * p = & i; code>