Qual è il valore di un puntatore Dereferenced
-
21-09-2019 - |
Domanda
mi sono reso conto che avevo un po 'di confusione per quanto riguarda il valore di un puntatore Dereferenced, mentre stavo leggendo un testo C con il seguente frammento di codice:
int main()
{
int matrix[3][10]; // line 3: matrix is tentatively defined
int (* arrPtr)[10] = matrix; // line 4: arrPtr is defined and initialize
(*arrPtr)[0] = 5; // line 5: what is the value of (*arrPtr) ?
La mia confusione è per quanto riguarda il valore di * arrPtr nell'ultima riga. Questa è la mia comprensione fino a quel punto.
Linea 3, matrice è declard (provvisoriamente definito) per essere un array di 3 elementi di tipo array di 10 elementi di tipo int.
Linea 4, arrPtr è definito come un puntatore ad un array di 10 elementi di tipo int. Inoltre è inizializzata come ptr ad un array di 10 elementi (cioè la prima riga della matrice)
Ora Linea 5, arrPtr è dereferenziato, cedendo la matrice reale, quindi è tipo è array di 10 int.
La mia domanda: Perché è il valore della matrice, solo l'indirizzo della matrice e non in qualche modo legato alla sua elementi
Soluzione
Il valore della matrice matrix
variabile è l'array, tuttavia (facilmente) "degrada" in un puntatore al suo primo elemento, che poi assegnato a arrPtr
.
Per vedere questo, l'uso &matrix
(è di tipo int (*)[3][10]
) o sizeof matrix
(uguale sizeof(int) * 3 * 10
).
Inoltre, non c'è nulla di sperimentale su tale definizione.
Modifica: Ho perso la questione nasconde nei commenti di codice: *arrPtr
è un oggetto di tipo int[10]
, in modo che quando si utilizza [0]
su di esso, si ottiene il primo elemento, a cui poi assegnare 5
.
I puntatori e gli array sono volutamente definiti a comportarsi similiarly, e questo a volte è fonte di confusione (prima di imparare le varie stranezze), ma anche estremamente versatile e utile.
Altri suggerimenti
Credo che è necessario chiarire la tua domanda. Se vuoi dire qual è il valore di printf("%i", arrPtr);
allora sarà l'indirizzo della matrice. Se vuoi dire printf("$i",(*arrPtr)[0] );
allora abbiamo una domanda più carnoso.
In C, gli array sono praticamente solo una cosa convenienza. All una variabile “matrice” è un puntatore all'inizio di un blocco di dati; solo come int []
equivale a un int*
, ossia la posizione nella memoria di un int, un int [][]
è un doppio puntatore, un int**
, che indica la posizione nella memoria di ... altro puntatore, che a sua volta punta a un particolare reale Int.