2016-01-07 24 views
6

Volevo sapere se esistono alternative per assegnare a un puntatore l'indirizzo del valore a cui punta. Per esempio, c'è il solito modo:Assegnazione di un indirizzo a un puntatore

int a = 10; 
int *ptr; 
ptr = &a; 

ma in alcuni posti che vedo ha dichiarato come:

int *ptr = &a; 

Sono entrambi questi modi equivalenti? Sono leggermente confuso perché ho sempre considerato * ptr come dare il valore di a, e non l'indirizzo. Qualcuno potrebbe spiegare per favore? Grazie.

+0

entrambi sono uguali solo – kapil

+2

Quando si scrive 'int * ptr;' si dichiara un puntatore. Quando scrivi * ptr, assegni un valore. È la déclaration che cambia il significato dell'operatore * – loginn

+1

Puoi anche scrivere 'int a = 10, * ptr = & a;' :) Sono la stessa cosa –

risposta

9

io sono un po 'confuso perché ho sempre considerato *ptr a dare il valore di a, e non l'indirizzo.

È davvero un po 'confuso come * viene utilizzato per dichiarare un puntatore e utilizzato anche come operatore di dereferenziazione. Il vero significato di * dipende dal contesto: se viene utilizzato in una dichiarazione, in un'inizializzazione o in un compito.

Vale la pena conoscere le differenze tra 1) dichiarazione, 2) inizializzazione e 3) assegnazione.

int *ptr; // 1) this is declaration without initialisation. 

int *ptr = &a; // 2) this is declaration **and** initialisation (initialise ptr to the address of variable a) 

int b = 10; 
*ptr = b; // 3) this is assignment, assign what pointed by ptr to value of variable b. 
  • In 1) il * significa che ptr è un puntatore a int (ma non ha ancora indicato alcun percorso valido).
  • In 2) il * significa che ptr è un puntatore a int e il suo valore iniziale è l'indirizzo della variabile a.
  • In 3) lo * è l'operatore di dereferenziazione, ovvero l'assegnazione di quello che è indicato da ptr al valore della variabile b.
+0

Grazie per la risposta! Lo capisco molto meglio ora :) – QPTR

2

No .. è la dichiarazione e l'intimità in un'unica riga.

Questo cancellerà l'idea ..

typedef int* intp; 

intp ptr=&a; 

Equivalentemente

intp ptr; //int *ptr; 
ptr=&a; // ptr=&a; 

risposta è: sì, sono equivalenti.

Si può chiedere- : - Come un compilatore capire (se * è indiretto o come in dichiarazione)

Ans: -? C è contesto sensitive..based dal contesto in cui è il compilatore usato lo decide.

+0

Grazie per la risposta! :) – QPTR

+1

va tutto bene ... @ QPTR .: – coderredoc

1

int *ptr; ptr = &a; è a int *ptr = &a; come int n; n = 3; è a int n = 3;.

Ciò significa che la dichiarazione del puntatore e l'inizializzazione non sono diverse dalle normali variabili. Preferisco usare una riga ogni volta che è possibile, poiché c'è meno pericolo di avere variabili non inizializzate.

+0

Grazie! Ora che so che sembra un po 'meno pericoloso usare l'one-liner, proverò a usare maggiormente questo approccio. – QPTR

1

Se l'operatore * viene utilizzato al momento della dichiarazione, viene utilizzato solo per indicare il tipo di variabile dichiarata. Mentre in tutti gli altri casi l'operatore * viene utilizzato come operatore di dereferenziazione (eccetto dove è utilizzato come operatore di moltiplicazione).

Così int *ptr = &a significa ptr è una variabile di tipo int * che è stato assegnato &a

E *ptr = a significa variable stored at address ptr (dereferenziando ptr) che viene assegnato a.

+0

Grazie per la risposta! – QPTR

2

Sono entrambi equivalenti?

Sì.

Il secondo è marginalmente preferito poiché il primo lascia ptr non assegnato fino all'ultima riga (anche se in pratica un compilatore probabilmente lo ottimizzerebbe).

Sono leggermente confuso perché ho sempre considerato * ptr come dare il valore di a, e non l'indirizzo.

Si sta confondendo la sintassi dichiarando una variabile con la sintassi per l'utilizzo di tale variabile.

int *ptr; 

solo dichiara una variabile denominata ptr che è un puntatore a un intero.

int *ptr = &a; 

fa esattamente la stessa cosa. La prima parte è ancora solo la dichiarazione del puntatore come prima. La parte dopo il segno di uguale inizializza ptr all'indirizzo del a

Lei ha ragione che dopo la dichiarazione, quando più tardi utilizza questa variabile nel codice successivo specificando *ptr vi darà il contenuto del puntatore (in questo caso il valore del a).

+1

Grazie mille per la risposta, ha aiutato a chiarire il concetto. Non mi aspettavo così tante risposte, e ogni risposta mi sta aiutando a capire il concetto, quindi non sarò in grado di accettare la tua risposta. Ma grazie mille! :) – QPTR

+1

Nessun problema @QPTR, sono contento che sia stato d'aiuto. – GrahamS

Problemi correlati