Newsgroup: it.comp.lang.c++
Titolo: I motivi dei riferimenti

riflettevo sull'uso dei riferimenti...
non sono essi altro che puntatori mascherati? nel senso, posso fare
con un riferimento tutto ciò che posso fare con un puntatore e
viceversa, o no?
l'unica cosa che sembra non possibile fare è modificare il valore
"puntato" dal riferimento... ma se fosse possiible fare questo,
puntatori e riferimenti sarebbero intercambiabili (a parte la
differenza di sintassi, naturalmente)
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 differenza di sintassi, naturalmente)
No, puntatori e "reference" non sono intercambiabili !
E' vero pero' che i reference sono, per cosi' dire, dei puntatori 
nascosti. Ti spiego con l'esempio classico della funzione "swap":
#include <stdio.h>
void swap (int &a, int &b)
{
   int t;
   t = a;
   a = b;
   b = t;
}
int main (void)
{
   int val1=25, val2=10;
   swap (val1, val2);
   /* Qui val1=10 e val2=25 */
   return 0;
}
Come vedi non ci sono puntatori in giro, ma in effetti alla funzione 
swap vengono passati gli indirizzi delle variabili val1 e val2.
Con i parametri "a" e "b" della funzione swap non ci puoi fare molto.
Puoi fare per esempio: int *pi = &a;
Ma se leggi/scrivi sulle variabili a e b, in realta' leggi/scrivi 
dalle/sulle variabili val1 e val2.
Non essendo poi a e b dei veri puntatori, non puoi cambiare il 
puntamento e non ci puoi fare altre operazioni (quella che viene 
chiamata l'aritmetica dei puntatori).

chiamata l'aritmetica dei puntatori).
e non era possibile farlo in maniera uguale usando i puntatori?
tipo (c docet)
swap(int* a, int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
???? cioč, voglio dire, a che servono VERAMENTE i riferimenti?


 ???? cioč, voglio dire, a che servono VERAMENTE i riferimenti?
Allora, intanto uno dei motivi per usare i reference e' quello di avere 
una maggiore leggibilita' del codice. Si vede bene nella tua swap che 
hai usato puntatori e dereferenziazioni a go-go. La funzione di swap e' 
ancora banale e semplice ma in altri casi ...
Poi c'e' anche un'altra cosa: alla tua swap puoi passare un puntatore 
nullo (NULL). Cosa fai ?
Un reference punta *sempre* ad un valore, quindi si puo' stare 
tranquilli. Se la swap e' dichiarata swap (int &a, int &b) io sono 
sempre sicuro che pur passando di "nascosto" dei puntatori, mi passera' 
sempre un puntamento valido a dei valori int.
Spero di aver chiarito la questione dei reference. Ciao

 sempre un puntamento valido a dei valori int.
Non vorrei aver detto una castroneria, perche' mi e' venuto un dubbio su 
questa cosa ! Non prenderla troppo per buona.

 wrote...

Anche i reference possono invalidarsi (se č questo il dubbio che ti č
venuto).
  int* ap = new int;
  int* bp = new int;
  int& a = *ap;
  int& b = *bp;
  delete ap;
  delete bp;
  swap(a,b); // undefined behaviour
Max

 ???? cioè, voglio dire, a che servono VERAMENTE i riferimenti?
Oltre ai motivi che ti hanno già detto, se non lo sai già, sono i reference
che ti permettono di scrivere cose tipo:
std::cout << "stringa" << std::endl;
Ovvero: std::cout.operator<<("stringa") ritorna un reference ad un ostream,
e su questo puoi riapplicargli operator<<(std::endl) concatenando i due
operatori. Usando i puntatori non avresti potuto farlo.
Ciao

bene, allora facciamo cosě: nel c+++ (con 3 piů) togliamo
completamente i puntatori, usiamo solo i riferimenti e permettiamo a
questi ultimi di essere modificabili...
tutto funziona ugualmente? oppure no?


 ???? cioč, voglio dire, a che servono VERAMENTE i riferimenti?
Pensa ad un operator+ senza i riferimenti...
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 Ciao.
e=*(*(*(a+b)+c)+d)
LOL
chiarissimo direi....

 tutto funziona ugualmente? oppure no?
E la compatibilità con i vecchi programmi che fanno uso dei puntatori?
E gli array dove li metti?
Ciao

E gli array dove li metti?
uhm... gli array... beh, si potrebbe trovare il modo di usare i
reference anche con essi...
del resto quando scrivo:
char s[100];
anche se s è un puntatore, non lo uso come tale, nel senso che con
l'array io punto ai suoi valori usando l'indice e non l'aritmetica dei
puntatori... né dereferenzio il puntatore, perché s[43] è già una
deferenziazione
e lo stesso discorso si può fare con:
char *s = new char[100];


 deferenziazione
Non è vero: scrivere s[43] equivale a scrivere *(s+43); dimostrazione è
questo fatto:
s[43] = *(s+43) = *(43+s) = 43[s]
ed infatti se provi a compilare ed eseguire questo programma:
#include <iostream>
int main() {
 char str[] = "ciao";
 int i = 2;
 std::cout << &(1[str]) << std::endl;
}
l'output che ottieni è "iao". Una cosa del genere non avresti potuta farla
con i reference.
Inoltre con i reference potresti riferirti ad un elemento della stringa, ma
se tu volessi riferirti ad un sottoinsieme della stringa? Tipo:
char str[] = "hello world";
char *str1 = &str[3];
Ma ti stanno così antipatici i puntatori?;-)
Ciao

 Non č vero: scrivere s[43] equivale a scrivere *(s+43); dimostrazione č
Piů in generale dato un tipo generico:
tipo arr[100];
arr[10]
equivale a scrivere:
*(arr + 10 * sizeof(tipo))
Nel caso del char non importa scrivere il sizeof perchč č garantito che
sizeof(char) == 1 č true.
Ciao

 viceversa, o no?
Un riferimento è un puntatore costante che viene dereferenziato in maniera
implicita.
Altri ti hanno spiegato il perchè della loro esistenza.
-- 
Domenico Testa - Studente

Ma ti stanno così antipatici i puntatori?;-)
;-) in realtà mi sta antipatica l'operatore -> e soprattutto la
possibilità che in uno stesso statement possa esserci sia l'operatore
-> che l'operatore . (insomma, che ci siano cose allocate staticamente
e altre dinamicamente)
insomma... antipatici è una parola grossa... mi chiedevo se erano
insostituibili


insostituibili
Be' per usare oggetti non dinamici, o comunque non dotati di puntatore, e di
grosse dimensioni...
-- 
Ciao,
Andrea (uno dei tanti)

grosse dimensioni...
manca la proposizione principale in questa frase :-!!! :-DDD


manca la proposizione principale in questa frase :-!!! :-DDD
Ops, eccola! ;-)
