Vettore di puntatori in C
Buon pomeriggio,
vorrei fare la seguente domanda:
Sia data la definizione globale:
int *V[10], A[10];
Poniamo caso che ogni elemento di V sia un puntatore che punta a uno degli elementi di A.
Se io volessi accedere agli elementi di A mediante V dovrei usare * o no?
Grazie mille!
vorrei fare la seguente domanda:
Sia data la definizione globale:
int *V[10], A[10];
Poniamo caso che ogni elemento di V sia un puntatore che punta a uno degli elementi di A.
Se io volessi accedere agli elementi di A mediante V dovrei usare * o no?
Grazie mille!
Risposte
Si certo.
Ad esempio
Ad esempio
int *V[10], A[10]; int main() { V[0] = &A[9]; A[9] = 88; *V[0] = 88; }
Grazie Quinzio,
ho ancora però un dubbio su come operare in circostanze simili con delle funzioni, a titolo di esempio ho scritto un programmino:
#include
int *V[1], A[1], val;
int inserimento(int * vettore){
int ciao;
ciao= vettore[0];
return ciao;
}
int main(){
V[0]=&A[0];
A[0]=1;
printf("%x\n",V[0]);
printf("%d\n", A[0]);
printf("%x\n",&A[0]);
printf("%d\n",*V[0]);
val=inserimento(V);
printf("%x",val);
}
Ora, non ho capito come fare a far si che nella variabile "ciao" venga memorizzato il valore contenuto in A[0], questo perchè, per come è scritta adesso, in ciao viene memorizzato &A[0] ma, se provo a cambiarla aggiungendo un puntatore come segue:
ciao=*vettore[0];
il compilatore mi da errore.
Come potrei fare?
Grazie ancora per la tua cortesia e il tempo gentilmente dedicatomi!
ho ancora però un dubbio su come operare in circostanze simili con delle funzioni, a titolo di esempio ho scritto un programmino:
#include
int *V[1], A[1], val;
int inserimento(int * vettore){
int ciao;
ciao= vettore[0];
return ciao;
}
int main(){
V[0]=&A[0];
A[0]=1;
printf("%x\n",V[0]);
printf("%d\n", A[0]);
printf("%x\n",&A[0]);
printf("%d\n",*V[0]);
val=inserimento(V);
printf("%x",val);
}
Ora, non ho capito come fare a far si che nella variabile "ciao" venga memorizzato il valore contenuto in A[0], questo perchè, per come è scritta adesso, in ciao viene memorizzato &A[0] ma, se provo a cambiarla aggiungendo un puntatore come segue:
ciao=*vettore[0];
il compilatore mi da errore.
Come potrei fare?
Grazie ancora per la tua cortesia e il tempo gentilmente dedicatomi!
Puoi cambiare la dichiarazione della funzione in
oppure
oppure puoi fare un cast direttamente sulla variabile, ma questa opzione e' da evitare
int inserimento(int ** vettore)
oppure
int inserimento(int * vettore[])
oppure puoi fare un cast direttamente sulla variabile, ma questa opzione e' da evitare
ciao = *((int **)vettore)[0];
Grazie ancora!
Ora il mio programma è diventato:
#include
int *V[1], A[1], val;
int inserimento(int ** vettore){
int ciao;
ciao= *(vettore[0]);
return ciao;
}
int main(){
V[0]=&A[0];
A[0]=1;
printf("%x\n",V[0]);
printf("%d\n", A[0]);
printf("%x\n",&A[0]);
printf("%d\n",*V[0]);
val=inserimento(V);
printf("%x",val);
}
Così funziona, ma credo di avere ancora bisogno del tuo aiuto in quanto non riesco a capire il perchè:
con la modifica che mi hai suggerito genero un puntatore di puntatore (o doppio puntatore) e poi passo alla funzione V=&V[0], ma, così facendo, non dovrei poi fare un salto doppio (ciao=**(vettore[0])) per passare da "vettore" a A[0] (il primo per raggiungere V[0] e il secondo per raggiungere A[0]=*V[0])?
Perché ne basta uno (ciao=*(vettore[0]))?
Grazie ancora!
Ora il mio programma è diventato:
#include
int *V[1], A[1], val;
int inserimento(int ** vettore){
int ciao;
ciao= *(vettore[0]);
return ciao;
}
int main(){
V[0]=&A[0];
A[0]=1;
printf("%x\n",V[0]);
printf("%d\n", A[0]);
printf("%x\n",&A[0]);
printf("%d\n",*V[0]);
val=inserimento(V);
printf("%x",val);
}
Così funziona, ma credo di avere ancora bisogno del tuo aiuto in quanto non riesco a capire il perchè:
con la modifica che mi hai suggerito genero un puntatore di puntatore (o doppio puntatore) e poi passo alla funzione V=&V[0], ma, così facendo, non dovrei poi fare un salto doppio (ciao=**(vettore[0])) per passare da "vettore" a A[0] (il primo per raggiungere V[0] e il secondo per raggiungere A[0]=*V[0])?
Perché ne basta uno (ciao=*(vettore[0]))?
Grazie ancora!
Il C tratta in modo sostanzialmente uguale gli array come puntatori.
Cioe' questo: V[1] viene letto dal C come *(V+1)
Quindi:
V ha come tipo int** oppure int *[]
V[n] ha come tipo int *
&V[n] ha come tipo di nuovo int **
La funzione inserimento prende int** vettore
quindi vettore[0] e' un int *
*vettore[0] e' un int
Capisco che sembra tutto confuso.
Con un po' di pratica le cose diventano chiare (o ci si abitua alla confusione che e' la stessa cosa).
Ad es: in C questo programmino e' legittimo e funziona.
Prova a dire a cosa e' uguale b ?
Cioe' questo: V[1] viene letto dal C come *(V+1)
Quindi:
V ha come tipo int** oppure int *[]
V[n] ha come tipo int *
&V[n] ha come tipo di nuovo int **
La funzione inserimento prende int** vettore
quindi vettore[0] e' un int *
*vettore[0] e' un int
Capisco che sembra tutto confuso.
Con un po' di pratica le cose diventano chiare (o ci si abitua alla confusione che e' la stessa cosa).
Ad es: in C questo programmino e' legittimo e funziona.
Prova a dire a cosa e' uguale b ?
int a, b; int main() { a = 10; b = *&*&*&*&a; return 0; }
Credo che b=a poiché hai bilanciato esattamente * e & e quindi fai tanti salti in avanti quanti ne fai all'indietro...
ok
Basta sapere che gli operatori [inline]&[/inline] e [inline]*[/inline] hanno la stessa precedenza e un'associatività che va da destra a sinistra.
Va bene, grazie a entrambi!
Vorrei solo aggiungere che nonostante gli array decadano a puntatori quando passati a funzioni, non sono sempre equivalenti. In particolare, se hai qualcosa come [tt]int A[10][/tt] hai che [tt]sizeof(A) == 40[/tt], ma [tt]sizeof(int*) == 8[/tt] (questo può variare a seconda del sistema). Inoltre, un array multidimensionale [tt]int A[10][10][/tt] non decade ad un puntatore di puntatore e i due tipi sono sostanzialmente diversi. Tutto questo rappresenta forse la parte più difficile da comprendere del C ed è fonte di confusione e frustrazione un po' per tutti.