Vettore di puntatori in C

Messaggioda mau21 » 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!
mau21
New Member
New Member
 
Messaggio: 33 di 83
Iscritto il: 01/02/2024, 11:13

Re: Vettore di puntatori in C

Messaggioda Quinzio » 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;

}
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 5840 di 10547
Iscritto il: 24/08/2010, 06:50

Re: Vettore di puntatori in C

Messaggioda mau21 » 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!
mau21
New Member
New Member
 
Messaggio: 35 di 83
Iscritto il: 01/02/2024, 11:13

Re: Vettore di puntatori in C

Messaggioda Quinzio » 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];
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 5841 di 10547
Iscritto il: 24/08/2010, 06:50

Re: Vettore di puntatori in C

Messaggioda mau21 » 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!
mau21
New Member
New Member
 
Messaggio: 36 di 83
Iscritto il: 01/02/2024, 11:13

Re: Vettore di puntatori in C

Messaggioda Quinzio » 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;
}
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 5843 di 10547
Iscritto il: 24/08/2010, 06:50

Re: Vettore di puntatori in C

Messaggioda mau21 » 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...
mau21
New Member
New Member
 
Messaggio: 37 di 83
Iscritto il: 01/02/2024, 11:13

Re: Vettore di puntatori in C

Messaggioda Quinzio » 12/02/2024, 13:00

ok
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 5844 di 10547
Iscritto il: 24/08/2010, 06:50

Re: Vettore di puntatori in C

Messaggioda utente__medio » 12/02/2024, 13:06

Basta sapere che gli operatori & e * hanno la stessa precedenza e un'associatività che va da destra a sinistra.
"Ci abbaiano, Sancho; segno che stiamo cavalcando!"
utente__medio
Junior Member
Junior Member
 
Messaggio: 325 di 394
Iscritto il: 02/11/2021, 12:48
Località: Draghistan

Re: Vettore di puntatori in C

Messaggioda mau21 » 12/02/2024, 13:46

Va bene, grazie a entrambi!
mau21
New Member
New Member
 
Messaggio: 38 di 83
Iscritto il: 01/02/2024, 11:13

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite