Discussioni su argomenti di Informatica
11/02/2024, 17:17
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!
11/02/2024, 17:50
Si certo.
Ad esempio
- Codice:
int *V[10], A[10];
int main() {
V[0] = &A[9];
A[9] = 88;
*V[0] = 88;
}
11/02/2024, 18:04
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<stdio.h>
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!
11/02/2024, 18:18
Puoi cambiare la dichiarazione della funzione in
- Codice:
int inserimento(int ** vettore)
oppure
- Codice:
int inserimento(int * vettore[])
oppure puoi fare un cast direttamente sulla variabile, ma questa opzione e' da evitare
- Codice:
ciao = *((int **)vettore)[0];
11/02/2024, 19:14
Grazie ancora!
Ora il mio programma è diventato:
#include<stdio.h>
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!
11/02/2024, 19:34
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 ?
- Codice:
int a, b;
int main()
{
a = 10;
b = *&*&*&*&a;
return 0;
}
12/02/2024, 09:15
Credo che b=a poiché hai bilanciato esattamente * e & e quindi fai tanti salti in avanti quanti ne fai all'indietro...
12/02/2024, 13:06
Basta sapere che gli operatori &
e *
hanno la stessa precedenza e un'associatività che va da destra a sinistra.
12/02/2024, 13:46
Va bene, grazie a entrambi!
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.