Domanda

    

Questa domanda ha già una risposta qui:

         

Basta entrare in C ++. Mi sto costantemente buttato fuori pista quando vedo il simbolo per moltiplicare (*) viene utilizzato per indicare la dereferenziazione di una variabile

Ad esempio: unsigned char * pixels = vidgrabber.getPixels();

Fa questo tiro altre persone fuori? Qual è il consiglio per ottenere la mia testa intorno a questo?

Grazie.


P.S. Ho un'altra domanda ragionevolmente semplice, che non ha ottenuto risposto :( qui: principiante domanda:!! aggiungere / sottrarre al valore piuttosto che essere solo che il valore pretty please e grazie per il vostro tempo

È stato utile?

Soluzione

C, e per successione C ++, sono sommersi con gli operatori e sono intrinsecamente sensibile al contesto. Si dovrà abituarsi ad esso:

Se appare * prima che il nome di una variabile che viene dichiarata (o definito), si tratta di un modificatore di tipo e fa quella variabile un puntatore.
Se si tratta di un operatore prefisso unario per una variabile che fa parte di un'espressione, di dereferenziazione (o qualsiasi altra cosa che è stato sovraccaricato a).
Se si tratta di un binario infisso operatore per due variabili che fanno parte di un'espressione, di moltiplicazione (o qualsiasi altra cosa che è stato sovraccaricato a).

(Da questo si può vedere che il * nel vostro unsigned char * pixel non è un prefisso unario dereferenziazione, ma un modificatore di tipo ).

Si noti che & praticamente assomiglia *, solo che è significato è diverso: si fa un variabile a di riferimento , è l'operatore di indirizzo, o il binario AND.

Altri suggerimenti

Una raccomandazione quando si scrive il proprio codice è quello di "coccolare" il * quando si utilizza come un puntatore / deref:

unsigned char *pixels = ...

if (*pixels == ...)

e allo spazio del * quando si utilizza come si moltiplicano:

int y = x * 7;

Ci sono altri indizi è possibile utilizzare (come ad esempio il fatto che il puntatore deref è un operatore unario mentre multiplo è un operatore binario).

La risposta è: la pratica. Ogni nuovo linguaggio di programmazione sarà divertente in una certa misura, un po 'più divertente di altri. Imparare ad usarlo e diventerà naturale.

È possibile distinguere l'operatore dereference dall'operatore moltiplicazione per il fatto che, di solito, un operatore di moltiplicazione non ha un nome di tipo alla sua sinistra.

Escogitato Esempio

ha scritto su dereferenziazione in C . Si può dire il risultato da solo a guardarla? ==>

int v[] = {5,6}, w[] = {7,8};
int m[][2] = { {1,2}, {3,4} };

int result = * v * * * m * * w;

Saluti

RBO

Lo stesso modo in cui gli anglofoni ottenere intorno al fatto che la stessa parola può avere significati diversi a seconda del contesto. Una volta che siete un po 'immersi nel contesto, che di solito è evidente che cosa l'operatore sta facendo.

Una cosa importante da notare su C rispetto ad altri linguaggi è che quando più dichiarazioni sono combinati in un comunicato, l'asterisco si applica ai singoli elementi, non il suo insieme. Ad esempio:

int* foo,bar;

crea un int-pointer chiamato foo, e un int chiamato bar. Ho sempre Peg l'asterisco alla variabile, ed evito di miscelazione puntatori e non puntatori in una dichiarazione in tal modo:

int *foo;
int *ptr1,*ptr2,*ptr3;
int bar,boz,baz;

E 'anche importante notare che le qualificazioni di storage di classe come 'const' e 'volatili' non sempre si legano come ci si aspetterebbe. La dichiarazione

volatile int *foo;
does non significa che 'foo' è un volatile, ma piuttosto che cosa punti 'foo' a è un volatile. Se foo è di per sé la cosa 'volatili', si deve scrivere "int * pippo volatili;"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top