Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Puntatori e Tipi: Guida Dettagliata, Sintesi del corso di Programmazione Avanzata

Questa lezione fornisce una dettagliata spiegazione su come utilizzare puntatori e definire nuovi tipi in un linguaggio di programmazione. Viene illustrato come dichiarare variabili con puntatori, come ottenere la posizione di una variabile in memoria e come accedere al valore di una variabile puntata. Inoltre, viene introdotto il concetto di strutture e come definire e utilizzarle per aggregare variabili eterogenee.

Tipologia: Sintesi del corso

2018/2019

Caricato il 21/10/2021

michele-fasolato
michele-fasolato 🇮🇹

5 documenti

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
quattordicesima lezione:
puntatori, di descrivono mettendo una * davanti al puntatore, esempio var p *int ossia variabile p che
contiene un puntatore a int.
Possiamo scirvere p=nil.
l’operatore & seguto da una variabile mi da la posizione del puntatore in memoria di una variabile. Es: p=&x
mi da la posizione di x. Quando facciamo scan(&x) gli stiamo passando un puntatore a x.
* è un operatore di indirezzione, ossia * non è sulla variabile che vediamo ma sulla variabile puntata. Es: var
p *int e *p=0 zero sarà indirizzato al valore a cui punta p.
se scrivo *&x è come scrivere x, praticamente * e & si cancellano.
Quindi uno prende la variabile puntata e l’altro il puntatore.
Puntatori sono posizioni in memoria delle variabili, nil indica posizione nullo, per ottenere la variabile
puntata dal puntatore si usa*.
Esempio:
var s string = “ciao”
var p *string
quello che succede è che noi abbiamo la variabile s che contiene ciao e p punta ad s.
(consideriamo che s sia alla posizione 4000)
con p=&s
Println(*p)= stampa ciao, corrisponde praticamente a scrivere s
Printn((*p)[0])= questo stampa 98 che è il numero in byte che corrisponde a c.
esempio:
func main () {
s:= “ciao”
var p *string = &s
Println(p, s) = stampa il valore ossia il puntatore e poi la string
}
func main () {
s:= “ciao”
var p *string= &s
*p=”mamma”
Println(s) = stampa mamma
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica Puntatori e Tipi: Guida Dettagliata e più Sintesi del corso in PDF di Programmazione Avanzata solo su Docsity!

quattordicesima lezione: puntatori, di descrivono mettendo una * davanti al puntatore, esempio var p *int ossia variabile p che contiene un puntatore a int. Possiamo scirvere p=nil. l’operatore & seguto da una variabile mi da la posizione del puntatore in memoria di una variabile. Es: p=&x mi da la posizione di x. Quando facciamo scan(&x) gli stiamo passando un puntatore a x.

  • è un operatore di indirezzione, ossia * non è sulla variabile che vediamo ma sulla variabile puntata. Es: var p *int e p=0 zero sarà indirizzato al valore a cui punta p. se scrivo &x è come scrivere x, praticamente * e & si cancellano. Quindi uno prende la variabile puntata e l’altro il puntatore. Puntatori sono posizioni in memoria delle variabili, nil indica posizione nullo, per ottenere la variabile puntata dal puntatore si usa. Esempio: var s string = “ciao” var p string quello che succede è che noi abbiamo la variabile s che contiene ciao e p punta ad s. (consideriamo che s sia alla posizione 4000) con p=&s Println(p)= stampa ciao, corrisponde praticamente a scrivere s Printn((p)[0])= questo stampa 98 che è il numero in byte che corrisponde a c. esempio: func main () { s:= “ciao” var p *string = &s Println(p, s) = stampa il valore ossia il puntatore e poi la string } func main () { s:= “ciao” var p *string= &s *p=”mamma” Println(s) = stampa mamma

esempio: x:= p:= &x(*int) var q *int=&p q diventa 3000 che l’indirizzo di p q=nil vuol dire che il puntatore a cui punta q diventa nil creazione di un incrementazione attraverso i puntatori: func più1(p * int) { (p)++ } func main () { x:= più1(&x) // & mi dà l’indirizzo della variabile Prinltn(x) } esempio: func più1(p * int) { (p)++ } func main () { var p int p= new(int) // new prende un insieme di byte in memoria e li azzera p=5 // gli sto dicendo di mettere nell’indirizzo a cui fa riferimento p il valore 5 Println(p, p) più1(p) Printlnl(p, p) } esempio altro: func piùuno(p *int) {

Println(x) posso scrivere: type anno int var x anno var y int ma NON posso fare x=y si può anche scrivere: type anno= int // rende anno identico ad int var x anno var y int posso fare x=y nuova parola struct: rappresenta un costrutto elementare, che può aggregare variabili eterogenee var x struct { // sto dichiarando una struttura x che contiene valori che ci sono nella scatola o struttura var nome string var cognome string var eta int } x.nome = “sebastiano” // mi va a modificare nome che è presente in x anche: var x, y struct { // sto dichiarando una struttura x che contiene valori che ci sono nella scatola o struttura var nome string var cognome string var eta int } x.nome = “sebastiano” // mi va a modificare nome che è presente in x y.nome= “Giovanni” Println(x, y) Println(x.nome, y.nome) // sono due scatole differenti // non è necessario metterci tutti i valori all’interno

con x=y // tutti i campi vengono copiati esempio: type persona struct { nome string cognome string eta } func main () { var x,y persona x.nome=”Sebastiano” x.cognome= “Vigna” x.eta= 10 y.nome= “gigio” y.cognome= “Florenzo” y.eta= 20 } altro esempio: type persona struct { nome string cognome string eta int } func invecchia (p persona) { (p).eta++ // meglio scrivere p.eta++ } func main () { var x persona // vale anche scrivere: x= persona {“Sebastiano”, “Vigna”, 10} // vale anche scrivere: x= persona {nome:“Sebastiano”, cognome: “Vigna”, eta:10}

esempio con le date: type data struct { g, m, a int } func natale (anno int) data { var nat data nat= data {25, 12, anno} return nat // oppure func natale (anno int) data { p:=new(data) *p= data {25, 12, anno} return *p // secondo tipo func type data struct { g,m,a int } type nascitamorte struct { nascita, morte data } type persona struct { nome string nm nascitamorte } } func main () { var p persona p.nm.nascita.g = var anno int Scan(&anno) Println(natale(anno)) }

altro programma: type data struct { g, m, a int } func bisestile (anno int) bool { return anno %4 ==0 && anno %100 !=0 || a%100== } func giorni (data data) int { c:= for i:=1; i<data.m; i++ { switch { case 11, 4, 6, 9: c += 30 case 2: if bisestile(data.a){ c+= } else { c+= } default : c+= } } return c + data.g } func main() { data data Scan(&data.g, &data.m, &data.a) Println(giorni(data)) }