11
votes

C ++ Débutant Question: Déréence vs Multiplier

Juste entrer dans C ++. Je suis constamment jeté de la piste lorsque je vois le symbole de multiplier ( * ) étant utilisé pour désigner la déséroférance d'une variable

Par exemple: Unsigné Char * pixels = vidgrabber.getpixels ();

Est-ce que cela jette d'autres personnes? Quel est le conseil pour avoir la tête autour de cela?

merci.


P.s. J'ai une autre question raisonnablement simple, qui n'a pas été répondue :( ici: Débutant Question: Ajout / Soustraire à la valeur plutôt que de simplement être cette valeur jolie s'il vous plaît! et merci pour votre temps!


6 commentaires

Votre exemple n'est pas la dermeférance - il suffit de faire partie du type de la variable pixels . Mais je sais ce que tu veux dire.


Vous avez demandé à Quel est le conseil pour avoir la tête autour de cela? (Signification: Connaissance de pointeur ici) - Je dirais: En vous habituant . Comment les gens ont-ils la tête autour de produire des armes biologiques dans un laboratoire moderne? Même chose.


L'adoption d'un style cohérent est la clé. Par exemple, n'utilisez jamais d'espaces des deux côtés du * sauf si vous l'utilisez comme opérateur de multiplication. Au lieu de Char * Pixels , choisissez Char * pixels ou Char * pixels .


Je trouve intéressant que la notation du pointeur C soit comparée à la production d'armes biologiques. Mais oui, ce que tout le monde a dit ici est correct. Le temps passé avec la langue vous rendra plus à l'aise avec sa syntaxe.


@ Cerc, ce n'est pas vraiment une comparaison (mais on pourrait ressembler à un) - c'est plutôt une opinion sur une classe de choses folles que les gens font tous les jours parce qu'ils pensent qu'ils n'ont d'autre choix. C'est appelé "aliénation" en termes philosophiques. (BTW. Je suis un programmeur C (plus tard C ++) depuis environ 20 ans)


Je suis tellement déformé par c que je suis confus quand je vois * être utilisé pour la multiplication :)


7 Réponses :


1
votes

Vous pouvez distinguer l'opérateur de déséroférence de l'opérateur de multiplication par le fait que, généralement, un opérateur de multiplication n'a pas de nom de type à sa gauche.


0 commentaires

24
votes

C, et par héritage C ++, sont inondés avec les opérateurs et sont par nature sensible au contexte. Vous devrez vous habituer:

Si * apparaît avant le nom d'une variable qui est déclarée (ou défini), il est un modificateur et rend cette variable un pointeur.
Si elle est un opérateur préfixe unaire pour une variable qui fait partie d'une expression, il est déréférencement (ou quoi que il a été surchargé pour).
Si elle est un binaire infix opérateur pour deux variables qui font partie d'une expression, il est multiplication (ou quoi que il a été surchargé pour).

(De cela, vous pouvez voir que le * dans votre unsigned char * pixel n'est pas un préfixe unaire déréférencement, mais de type modificateur .)

Notez que & à peu près ressemble * , seule signification de c'est différent: il est une variable référence , est l'adresse de opérateur, ou le binaire ET.


3 commentaires

+1 Pour une bonne réponse à la généralisation de cette question ainsi que cette question elle-même. J'aime particulièrement "Context-sensible"


+1 pour expliquer en détail les différents usages de *. Que diriez-vous d'expliquer davantage la différence entre & et *?


@Arun: Je ne suis pas sûr de ce que vous attendez.



8
votes

Une recommandation Lorsque vous écrivez votre propre code consiste à "câliner" le * lorsque vous utilisez comme un pointeur / DEREF:

int y = x * 7;


0 commentaires

2
votes

La réponse est: Pratique. Chaque nouveau langage de programmation sera drôle dans une certaine mesure, d'autres plus drôles que d'autres. Apprenez à l'utiliser et il deviendra naturel.


0 commentaires

1
votes

Exemple de contreveille

Vous avez écrit sur Déroference en C . Pouvez-vous dire le résultat de le regarder? ==> xxx

regarde

rbo


6 commentaires

La signification de * v * * * m * * w est que le chat a été mis sur le clavier à nouveau. (Cela fait-il beaucoup quand il se bat pour attirer l'attention.)


Très bonne réponse! Un débutant qui est nouveau aux pointeurs en bénéficiera sûrement.


Sur le dessus de ma tête, je pense que "* * m" va produire quelque chose de wonky .. * m est 1, mais ** m le contenu de l'adresse mémoire 0x00000001 qui pourrait être quelque chose sur certaines plates-formes. Quoi qu'il en soit, quoi que ce soit, le résultat sera que Times 35.


Il ne peut toujours pas y avoir qu'un seul multiplicateur après une variable, toutes les autres sont des déréférences. Donc, il suffit de suivre les conseils pour garder les déréglexes fermer (= pas d'espace) à la variable, de sorte qu'il passe de int résultat = * v * ** m * * w et solution est assez simple.


@Sparr: Je pensais que tu as raison (et donc ma réponse ne va pas), mais le désassemblage vous prouve tort.


Pourquoi * m 1? m est un tableau de tableaux, donc * m est {1, 2} et ** m est 1. Le résultat est de 35.



1
votes

De la même manière, les anglophones se content du fait que le même mot peut avoir des significations différentes selon le contexte. Une fois que vous êtes un peu immergé dans le contexte, il sera généralement évident que l'opérateur fait.


0 commentaires

1
votes

Une chose importante à noter environ C comparé à d'autres langues est que, dans la mesure où plusieurs déclarations sont combinées dans une seule déclaration, l'astérisque s'applique aux éléments individuels, et non à l'ensemble de l'ensemble. Par exemple:

volatile int *foo;


0 commentaires