11
votes

Quelle est la différence entre un pointeur et une variable de pointeur?

Je sais que c'est très basique, mais c'est un peu déroutant pour moi.
J'ai lu:

Un pointeur n'est rien de plus qu'une adresse et une variable de pointeur est une variable qui peut stocker une adresse < / fort>.
Lorsque nous stockons l'adresse d'une variable i dans la variable de pointeur p , nous disons que p points sur < code> i . xxx

p Points sur i .

pour accéder à l'objet qu'un pointeur Points à, nous utilisons l'opérateur * (indirection).

Si p est un pointeur alors * p représente l'objet à quel p Points actuellement.

Maintenant, je suis confondre que dois-je appeler p - pointeur ou variable de pointeur ?

Supplément: est un pointeur toujours identique à une adresse?


4 commentaires

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; est équivalent à int i; int * p = & i;


6 Réponses :


2
votes

Le jeton p est une variable de pointeur, qui pointe vers une variable i . Nous pouvons simplement appeler cela un pointeur.

Déclaration: xxx

déclare p comme identifiant d'un objet int objet. Ceci est généralement indiqué plus succinctement que P est un pointeur vers I '. P peut être utilisé pour renvoyer Int variable i après l'expression p = & i . Pour accéder à la valeur de la variable i à l'aide du pointeur p Vous pouvez utiliser l'opérateur de déséroférence * (par exemple, * p ) . Et i = 10; équivalent à * p = 10; .

aussi, remarque dans l'expression p = & i; pour lire l'adresse de i i i utilisé & ampersand opérateur également appelé adresse de l'opérande .

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.

Vous souhaitez lire: Quel est exactement un pointeur C sinon une adresse mémoire?
De plus, lisez ceci: Pour comprendre le but des pointeurs.


3 commentaires

Mais il est dit que Un pointeur n'est rien de plus qu'une adresse


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.



0
votes

Le pointeur des termes et la variable de pointeur sont souvent utilisés de manière synonyme.


0 commentaires

0
votes

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": xxx < / pré>


0 commentaires

7
votes

La différence entre une valeur de pointeur et une variable de pointeur est illustrée par: xxx

ici, p2 est une variable de pointeur; C'est un pointeur de int . D'autre part, dans l'appel à swap_int () , l'argument & v1 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 ), mais simplement écrire & v1 ne crée pas une variable de pointeur. À l'intérieur de la fonction appelée, la valeur du pointeur & v1 est attribuée à la variable de pointeur locale i1 et la valeur de la variable de pointeur p2 est attribué à la variable de pointeur locale i2 , mais ce n'est pas la même chose que dire & v1 est une variable de pointeur (car il n'est pas une variable de pointeur; c'est simplement une valeur de pointeur; ).

Cependant, à plusieurs fins, la distinction est floue. Les gens diraient ' p2 est un pointeur "et c'est assez vrai; C'est une variable de pointeur et sa valeur est une valeur de pointeur et * p2 est la valeur de l'objet que p2 pointe vers. Vous obtenez le même flou avec ' v1 est un int '; Il s'agit en fait d'une variable int et sa valeur est une valeur int .


12 commentaires

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 à 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?


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 et ajouter les deux < Code> int s et tronquez la somme. 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 à p , ne devrait-il pas être l'adresse du v2 car nous échangeons V1 et v2 ?


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.)



7
votes

Remplacons le mot "pointeur" avec un type de données, j'espère plus familier, comme un int : xxx

ici 42 est un int Valeur et N est une variable qui contient un int . Vous pouvez appeler n un " int variable". Un int est un nombre comme 42 ou -25315685, et une variable int contient ces chiffres. Une fois que vous avez une variable, vous pouvez attribuer différents numéros. Rien de déroutant jusqu'à présent?

A Pointer 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 . 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.

donc, Quelle est la différence entre un pointeur et une variable de pointeur? 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 n un " int variable" mais juste int , 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.

est un pointeur toujours une adresse? C'est une question sur la signification du mot "adresse" plus que toute autre chose. Un pointeur est toujours une adresse dans le sens où elle correspond à un emplacement de mémoire d'une manière ou d'une autre, c'est une "adresse" pour cet emplacement de mémoire. Mais d'autre part, si l'emplacement de la mémoire n'est pas accessible au programme ou n'a rien d'utile, est-ce vraiment une "adresse" pour quoi que ce soit?

examine maintenant le code suivant : xxx

La première ligne déclare une variable de pointeur appelée p . Les pointeurs qui peuvent être stockés dans p sont des emplacements de mémoire pour int ; Ceci est important pour des raisons que nous verrons plus tard. Nous ne donnons toujours pas de p 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.

dans la deuxième ligne, nous prenons l'adresse de la variable n avec le et -Opérateur et assignez-le à p . Maintenant p stocke l'adresse de n , l'emplacement de la mémoire où la valeur de n est stockée.

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 * -opérateur, puis (* p) peut être utilisé comme vous pouvez utiliser n . Par exemple, vous pouvez écrire une nouvelle valeur dans n avec ceci: xxx

C'est à ce stade que cela devient évident pourquoi nous devons connaître le Type de données que p peut pointer sur: sinon, vous ne pouvez pas savoir ce que vous pouviez attribuer à (* p) .

Une autre raison pour laquelle il est important de connaître le type de données que p peut pointer sur est pointeur arithmétique . Par exemple, p + 1 est un pointeur sur le int stocké en mémoire juste après n ; Si p était un pointeur sur une grosse structure de données p + 1 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.


4 commentaires

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?


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.



-1
votes

Pointeur: une variable dont la valeur est l'adresse d'une autre variable.

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.


1 commentaires

Vous avez probablement essayé de dire "Pointeur: adresse d'une autre variable".