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

È stato utile?

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.

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