Voglia di Mac , anche su Facebook

Voglia di Mac , anche su Facebook
Diventa membro di iBlog anche su Facebook!
Powered By Blogger

Qui iSpazio con il Feed su iPod Touch, iPad Italia e recensioni App Store.

Benvenuto in iBlog!

Benvenuto in iBlog , 

iBlog è un blog per interessi di  Mac OS X e anche iPhone OS ,  se se hai interessi da da condividere sul blog , scrivi un ' articolo e poi noi lo inseriremo su iBlog!

Pagine

martedì 10 agosto 2010

Avanzate di linguaggio C parte 2: Operazione sui puntatori

Bene rieccoci qua con il nostro linguaggio preferito ovvero il C!
Oggi parleremo di come sommare due puntatori anche se vi sa strano....ma cerchiamo di capire che cosa andremo a fare
Queste somme permettono di cambiare indirizzo a mio piacimento avendo un intero controllo sulla memoria!
Non vi sembra fantastica come idea! A me pare di si e ora vi insegno come fare:
Introduciamo prima di tutto l' operatore sizeof(T) ove T è un parametro noto.
Che fa? Semplice assegnatogli un parametro esso ne calcola la lunghezza dando un valore size_t che è un unsigned int ovvero un intero senza segno.
Ma a che serve questa cosa che ha poca utilità visto che uno sa che un parametro int occupa 4 bit di memoria il double 8 ecc...?
Semplice per capire di quanto si sposterà l' elemento visto che quando salvo un dato a differenza dei documenti sono salvati in bit contigui e non li spacca all interno della memoria.
Ora diamo le formule affinchè anche voi capiate quel che ho detto (attenzione NON sono esempi ma formule che spiegano cosa fa l' operazione sulla vostra memoria)
La somma si può fare fra un valore ( chiamiamolo x ) e un puntatore ( chiamiamolo p ) entrambi di dimensione size_t (NOTARE che devono essere uguali).
Ecco che succede se li sommo:
x+p = (indirizzo puntato da p)+ (size_t*x)
Capite che come si somma si sottrae o no?
Volete un ESEMPIO non è vero? Eccolo:
1 int a= 100, *b=&a;
2 int *c= b+5;
Dove è c? Credo che a nessuno verrà lo stesso risultato perche dipende dalla vostra memoria ma so che c è spostato di 20 bit da a.
Trucchetto se volete spostare solo di uno: è più furbo farlo con gli operatori ++ (incremento) e -- (decremento)
Ora passiamo alle somme che si possono fare fra 2 puntatori che chiamiamo per carenza di fantasia p e q (ATTENZIONE devono avere la stessa dimensione size_t)
Ecco che succede se li sommo:
p+q = (indirizzo puntato da p+indirizzo puntato da q) / size_t
Capite che come si somma si sottrae cambiando + con - anche nella formula.
Volete anche qui un ESEMPIO non è vero? Eccolo:

1 int a=100, b=200;
2 int p= &a , q=&b;
3 int *c= p-q
Dove è c? Credo che a nessuno verrà lo stesso risultato perche dipende dalla vostra memoria ma ora nn so nulla eccetto il fatto che dividerò la somma dei due indirizzi per 4.
Ecco per oggi è tutto e alla prossima lezione
Ciao
Luca


mercoledì 4 agosto 2010

Avanzate di linguaggio C- parte 1: Introduzione all' uso dei puntatori

Salve rieccoci qui per parlare di C ma questa volta da un punto di vista superiore iniziando a introdurre il concetto di puntatore che durerà molto perchè è un grosso concetto che va digerito poco per volta e sarebbe inutile scrivere tutto subito sarebbe suicida quindi ho già porzionato il giusto per ogni articolo.
Ma ora iniziamo a parlare dei puntatori.
Che cos' è un puntatore?
Un puntatore è una variabile che rappresenta un indirizzo di memoria
A che può servire?
Beh...serve tantissimo visto che modificano il valore della variabile a cui puntano senza usare nuova memoria per salvare il risultato e vi assicuro che se fate 1000 calcoli su interi salvare 4000 byte di spazio è molto meglio di usare per salvare nuovi risultati!
Ecco un argomentazione valida per usarli...
Ma come si dichiara e si usa?
Semplice si fa così
(tipo) * (nome del puntatore)
ESEMPIO int * x significa che ho detto che ci sarà un puntatore intero di nome x.
Ora ci chiediamo a che cosa lo facciamo puntare?
Ad una variabile che ha un indirizzo di memoria visto che il puntatore non viene salvato in memoria (ed ecco altro risparmio sulla memoria) e si fa nel seguente modo
(nome puntatore) = & (nome variabile)
ESEMPIO (int b) x= & b detto che b è intero x lo può puntare, facile no?
Ora credo che gradiate un esempio quindi eccolo qua:
1 int a=100, b=50 , *p;
(NOTATE CHE posso dichiarare variabili e puntatori assieme)
2 p= &a
(ORA p punta a d a variabile)
3 int c= *p
(ATTENTI con * posso anche dare ad una variabile il valore puntato dal puntatore così, quindi c = valore a = 100)
4 p = &b
(Cambio il posto su cui puntare)
5 int f = *p + 10
(f vale b+10 perchè p ORA punta b)
6 *p=*p+5
(ATTENTI così modifico p si ma anche b!!! Ora b vale 55!!!!)
7 int *q= &a
(SI può inizializzare e dichiarare assieme)
8 int d = *p * *q
(Provate e ricavare il valore di d o con la logica o scrivendo del codice di contorno che potete creare da soli)

Tutto qui.
Facile vero? Se volete sapere che fa 8 fatemelo sapere e io pubblico la soluzione....
Bene ultima stuzzicante possibilità: Sapere a che indirizzo sta la variabile puntata da b con qst riga di codice
printf("b=%d , indirizzo: %p\n", b, &b)
Sarà un numero esadecimale ovvero in base 16 e niente paura se viene "19BF" visto che oltre le cifre 1-9 ci sta A=10,B=11,C=12,D=13,E=14,F=15.
Bene per ora è veramente tutto alla prossima per sapere ancora dei puntatori.
Luca