2011-12-07 9 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

uscita:Indirizzo di matrice

0045FB88 0045FB88 
0045FB88 0045FB7C 

L'uscita u senso.

Capisco che t e &t[0] dovrebbero avere lo stesso valore, ma come mai &t è lo stesso? Cosa significa in realtà & t?

+4

¤ L'unica differenza tra 't' convertita in puntatore e' & t', è il tipo di puntatore. Il referente di quest'ultimo è formalmente di tipo array, quindi aggiungendo 1 ad esso si muove un bel po '(alla successiva matrice di questo tipo in memoria).Mentre il referente dell'ex è del tipo di elemento. Terminologia: nel gruppo Usenet [comp.lang.C++] ci sono state alcune polemiche sul fatto che un puntatore come il tuo 'u' possa essere" puntato "sull'array, dal momento che il suo referente non è di tipo array. Ciò è stato risolto mille volte facendo riferimento all'uso di tale formulazione da parte dello standard. Cheers & hth., –

+0

@alf non era che quel tipo di paul che girava con quella domanda? –

+0

@ JohannesSchaub-litb: sì –

risposta

18

Quando t viene utilizzato da solo nell'espressione, viene eseguita una conversione da matrice a puntatore, che produce un puntatore al primo elemento dell'array.

Quando t viene utilizzato come argomento dell'operatore &, non avviene alcuna conversione. Lo & prende quindi esplicitamente l'indirizzo di t (l'array). &t è un puntatore all'array nel suo complesso.

Il primo elemento dell'array si trova nella stessa posizione in memoria dell'inizio dell'intero array e pertanto questi due puntatori hanno lo stesso valore.

+0

Grazie! Suppongo che sia stata la conversione implicita da matrice a puntatore a darmi la mentalità sbagliata di essere un puntatore. – quuxbazer

+0

@quuxbazer: 'u' è un puntatore. '' È un array. 'int * u = t' applica una conversione da matrice a puntatore a' t' e inizializza 'u' con il risultato. – Mankarse

+0

-1 questa è una descrizione errata per C++ –

0

t è l'indirizzo dell'array, &t è un puntatore all'array, quindi l'indirizzo mostrato è identico.

Un buon riferimento che ho trovato è il cplusplus forum che spiega molto bene questo concetto.

Come si è detto là circa &array:

Si tratta di una delle eccezioni dove la regola non si applica. Lo prende come un puntatore all'array. Punterà nuovamente al primo elemento dell'array, ma se ne aggiungi uno a questo puntatore, esso punterà all'indirizzo del posto subito dopo l'ultimo elemento dell'array (proprio come hai saltato l'array).

+1

-1 "& t è un riferimento al primo indirizzo dell'array" non è corretto –

+0

@ AlfP.Steinbach In che modo? & t è un riferimento all'inizio del blocco di memoria usato dall'array, quindi, un riferimento al primo indirizzo dell'array, a meno che non sto mescolando i miei significati cambiando la dicitura? – Serdalis

+0

'& t' non è un riferimento. è un valore puntatore. nota che * puoi * avere un riferimento a un array, ma '& t' non è quello. –

-2

Non esiste una variabile denominata t, poiché non è possibile modificarla. Il nome t si riferisce semplicemente all'indirizzo del primo elemento (e ha anche una dimensione associata ad esso). Quindi, prendere l'indirizzo dell'indirizzo non ha senso, e C "collassa" nel solo fatto di essere l'indirizzo.

La stessa cosa accade per il caso di funzioni:

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

Questo dovrebbe stampare la stessa cosa, poiché non v'è alcuna variabile tenendo l'indirizzo del foo, il cui indirizzo a sua volta può essere preso.

+1

È C++ e c'è una variabile chiamata 't'. Puoi passarlo alla funzione che accetta argomenti con tipo 'int (&) [10]'. – Abyx

+3

-1 "Non esiste una variabile denominata t, poiché non è possibile modificarla." non è corretto. Un oggetto che viene chiamato in una dichiarazione è chiamato una variabile. Vai a cercare lo standard. –

3

Il tipo effettivo di t è int[10], quindi &t è l'indirizzo della matrice.
Inoltre, int[] converte implicitamente int*, così tconverte affrontare di matrice il primo elemento della matrice.

+2

No, converte l'indirizzo del primo elemento. Le posizioni di memoria assoluta sono le stesse, ma i tipi sono molto diversi. –

+0

@ BenVoigt, sì, grazie. – Abyx