View Full Version : [C/PHP] Strani operatori per scrivere estensioni per PHP
felix085
15-11-2008, 19:40
Ciao a tutti,
Da un pò di tempo mi sto cimentando nello scrivere un estensione per PHP in C...
Però nel cammino ho incontrato operatori nuovi, mai visti, del tipo:
- (void**)&tmp
- zval ***data
Cosa diavolo sono quelli asterischi?!? :muro:
Posso capire 1, ma 3 cosa fanno?
Possibile che mi sia perso un operatore del C in "tanti" anni?
Datimi un consiglio per favore!
Non sono operatori diversi, è solo l'operatore * ripetuto tante volte ;) Poi non è nemmeno un operatore in quei casi.
Il primo è un cast esplicito dell'indirizzo di tmp a void **, cioè un puntatore a puntatore di tipo void.
Per il secondo il ragionamento è lo stesso, è un puntatore a puntatore a puntatore di tipo zval.
E' probabile che il secondo tu l'abbia trovato come parametro di una funzione.
Si può anche usare per allocare un vettore tridimensionale, ma l'uso più comune è quello del passaggio per puntatore di un vettore bidimensionale.
Ad esempio:
void allocaMatrice(int ***m, int r, int c)
{
*m = (int **)malloc(sizeof(int) * r);
for(int i = 0; i < r; ++i)
*m[i] = (int *)malloc(sizeof(int) * c);
}
La funzione si usa così:
int **m;
allocaMatrice(&m, 10, 5);
Si usa il passaggio per puntatore (o anche detto per indirizzo) in modo che i cambiamenti effettuati all'interno della funzione si riflettano anche nel valore della variabile passata dal chiamante.
SerMagnus
16-11-2008, 10:28
scuso l'intromissione, ma il discorso è interessante.
quindi l'operatore * andrebbe ripetutto tante volte quante sono le dimensioni del vettore?
scuso l'intromissione, ma il discorso è interessante.
quindi l'operatore * andrebbe ripetutto tante volte quante sono le dimensioni del vettore?
Come dicevo, in quei casi non è un operatore, è solo uno specificatore di tipo della variabile.
Comunque sì, ovviamente cambia anche l'allocazione, per un vettore tridimensionale ci vorranno due for annidati per allocare le varie matrici.
felix085
16-11-2008, 20:04
Grazie infinite cionci :ave:
Avevo il sospetto che fossero dei puntatori di puntatori...
Però mi sfugge il significato e la logica:
Ad esempio un puntatore punta l'indirizzo di una variabile,
Un puntatore di puntatori a cosa punta?
Grazie ancora!
Guardalo come un gioco di scatole cinesi.
Un puntatore contiene l'indirizzo di una variabile, un puntatore a puntatore con tiene l'indirizzo di un puntatore.
felix085
18-11-2008, 16:30
Dopo un pò di "studio" ho appreso come usare i puntatori di puntatori.
In realtà, all'inizio, non riuscivo a capire a cosa servissero e quali vantaggi portassero.... poi in realtà ho scoperta che sono proprio una bella cosa e in molte casi, ad esempio, possono soppiantare le catene.
Grazie ancora! :)
possono soppiantare le catene.
Catene ??? Che sono ?
felix085
18-11-2008, 17:29
Catene ??? Che sono ?
Io le chiamo/mi hanno insegnato cosi , ma in realtà sono comunemente dette "Liste".
Chiamate anche cosi perché con le liste con doppi puntatori, uno l'elemento successivo e uno precedente, formano una "catena"
Mai sentito chiamarle così, sempre double linked list.
Certo, per quelle sono utilissimi i puntatori a puntatori. Servono per cambiare il valore del puntatore all'interno di una funzione e far riflettere il cambiamento sul chiamante ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.