ho alcune domande ;
1)non ho ho definito nessuna istanza della struttura "ListaNodi" , dove il compilatore trova i dati ?
è un discorso analogo al dichiarare una stringa del tipo char *Ptr = " value" ; ??
cioè da qualche parte nella memoria crea una stringa ?
No. Infatti hai solamente creato un puntatore. Lo devi inizializzare con malloc() prima di utilizzarlo.
Quel char *Ptr = "value" non funziona in quanto così facendo tu assegni un valore al lvalue del puntatore (l'indirizzo in memoria). Quando crei un puntatore in memoria, non allochi i byte necessari per il suo contenuto, che vanno allocati o con new oppure con malloc()
facendo
codice:
char *Ptr = 0; //pointer vuoto
Ptr = (char*)malloc(10*sizeof(char));
creerai una stringa di 10 char utilizzabile.
qualora dichiarassi un puntatore di stringhe del tipo char *xxx [2] = { "vvvv" , "nnn" } ;
come si può accedere ad ogni carattere di ogni singola stringa?
facendo così crei una matrice di puntatori a char.
Attenzione: tra char xxx[2][10] e char *xxx[2] c'è differenza
la prima, è come se creassi una stringa di 20 char (char xxx[20]) solo che il compilatore lo vede come una matrice e quindi sa che accedendo con [1][1] lui deve leggere l'11 char della "stringa".
Il problema è che facendo char *xxx[2] ogni riga della matrice contiene semplicemente char* (un puntatore di char) che dovrai provvedere ad inizializzare con malloc()
2)Corrente = *sTesta; che senso ha assegnare al puntatore corrente l'indirizzo di quello di testa ?
codice:
Corrente = *sTesta;
while (Corrente != NULL && value >Corrente->character ) {
Precedente =Corrente;
Corrente =Corrente->nextPtr;
}
Intanto non gli assegna l'indirizzo ma il valore (*<puntatore> ricava il valore del puntatore)
Lo fa perchè con il while lui scorre tutti i nodi e compara i caratteri contenuti in essi, se sono minori (quindi la lettera non è in ordine), allora non la inserisce.
3) while (Corrente != NULL && value >Corrente->character ) .. ma corrente->character quando è stato inizializzato ?
Una delle condizioni del while è di controllare se Corrente è NULL, se non è inizializzato non cicla
4) che senso ha un espressione del tipo
*testa =( *Testa ) -> carattere ; perchè le parentesi tonde?
Questa espressione è sbagliata. Cmq si mettono le parentesi tonde per ricavare il valore del puntatore e quindi non vederlo più come puntatore ma come struttura statica, quindi poter accedere ai suoi valori con . e non con ->
L'utilizzo corretto è
codice:
*testa =( *Testa ) . carattere ;
Comunque le parentesi si mettono perchè altrimenti non avresti modo di ricavare il valore del puntatore in quella situazione:
codice:
*testa =*Testa . carattere ;
senza parentesi ricaveresti il valore di carattere (se è un puntatore, sennò c'è un errore di compilazione)