2009-06-13 15 views
7

Vorrei sapere se un puntatore memorizza l'indirizzo di qualsiasi variabile ... allora da dove otteniamo il puntatore?Un puntatore ha anche un indirizzo o un'allocazione di memoria?

quello che ho chiesto era che se stiamo usando direttamente puntatore, allora ci deve essere un luogo da cui si ottiene questo indicatore?

Si prega di aiuto, Sto diventando confuso ...: ((

+0

rimarcato posta. Rubino? Dai. –

+1

Così com'è, la domanda non ha senso. –

+0

Ho praticamente risposto alla tua domanda e un paio di altri ti hanno mostrato degli esempi. C'è qualcos'altro che ti serve? –

risposta

4

Guardate questa SO Post per una migliore comprensione dei puntatori What are the barriers to understanding pointers and what can be done to overcome them?

Per quanto riguarda la tua domanda va, se ho capito. ciò che si desidera, poi, in fondo, quando si dichiara un puntatore, si specifica un indirizzo o di un indice numerico che viene assegnato a ogni unità di memoria del sistema (in genere un byte o una parola). il sistema fornisce quindi un'operazione per recuperare il valore memorizzato nella memoria a quell'indirizzo.

10

Sì. Qui di seguito ho un int e un puntatore a un int e codice per stampare l'indirizzo di memoria di ognuno.

int a; 
printf("address of a: %x", &a); 

int* pA = &a; 
printf("address of pA: %x", &pA); 

I puntatori, su sistemi a 32 bit, occupano 4 byte.

3

In C:

char *p = "Here I am"; 

p quindi memorizza l'indirizzo in cui è memorizzato 'H'. p è una variabile. Si può prendere un puntatore ad esso:

char **pp = &p; 

pp ora memorizza l'indirizzo di p. Se si desidera ottenere l'indirizzo di quello sarebbe &pp ecc. Ecc.

26

Sì, un puntatore dichiarato ha la propria posizione in memoria.

alt text

Nell'esempio di cui sopra, si ha una variabile, 'b', che memorizza il valore "17".

int b = 17; /* the value of 'b' is stored at memory location 1462 */ 

Quando si crea un puntatore a quella variabile, il puntatore è memorizzato nella propria posizione di memoria.

int *a; 
a = &b;  /* the pointer 'a' is stored at memory location 874 */ 

È compito del compilatore sapere dove "ottenere il puntatore". Quando il tuo codice sorgente si riferisce al puntatore 'a', il compilatore lo traduce in -> "qualsiasi valore di indirizzo è memorizzato nella posizione di memoria 874".

Nota: questo diagramma non è tecnicamente corretto poiché, nei sistemi a 32 bit, entrambi i puntatori e int utilizzano quattro byte ciascuno.

+0

E i puntatori ai campi NULL? Specificamente in tipi di dati astratti ricorsivi. - Sto imparando sulle liste collegate. Un elenco collegato è effettivamente un numero infinito di puntatori (nodi ricorsivi). Quelli prendono la memoria? Oppure i valori nulli non occupano memoria? – Federico

1

Le offerte del compilatore a tradurre le variabili nel nostro codice in posizioni di memoria utilizzati nelle istruzioni macchina. La posizione di una variabile puntatore dipende da dove si è dichiarata nel codice, ma i programmatori di solito non hanno a che fare direttamente con quella.

Una variabile dichiarata all'interno di una funzione è presente nello stack o in un registro (a meno che non sia dichiarata statica).

Una variabile dichiarata al livello superiore risiede in una sezione di memoria nella parte superiore del programma.

Una variabile dichiarata come parte di una struttura o matrice allocata dinamicamente è presente nell'heap.

L'operatore "&" restituisce la posizione di memoria della variabile, ma a differenza dell'operatore "*", non può essere ripetuto.

Ad esempio, * * * ottengo il valore all'indirizzo * * i, che è il valore all'indirizzo * i, che è il valore memorizzato in i, che il compilatore calcola come trovare.

Ma & & non verrà compilato. & i è un numero, che è il percorso di memoria utilizzato dal compilatore per la variabile i. Questo numero non è memorizzato da nessuna parte, quindi & & non ha senso.

(Si noti che se & i è usato nel codice sorgente, il compilatore non può memorizzare i in un registro.)

Problemi correlati