View Full Version : [C++] Dubbio
queste due dichiarazioni non dovrebbero essere identiche?
int *m, *n;
int* m, n;
potete aiutarmi a capire questa cosa?:cry:
lorenzo001
14-01-2014, 12:37
Non lo sono, la prima equivale a
int *m;
int n;
la seconda
int *m;
int *n;
grazie lorenzo.
visto che ci sono:
void foo1(int &a)
{
...
}
significa che nella chiamata alla funzione foo1 devo passargli l'indirizzo di una variabile, quindi il contenuto di un puntatore giusto?
es.
int *x;
int a;
x = &a;
foo1(x);
tomminno
14-01-2014, 13:22
grazie lorenzo.
visto che ci sono:
void foo1(int &a)
{
...
}
significa che nella chiamata alla funzione foo1 devo passargli l'indirizzo di una variabile, quindi il contenuto di un puntatore giusto?
es.
int *x;
int a;
x = &a;
foo1(x);
Assolutamente no!
Quella è una funzione che accetta in ingresso un riferimento.
int a = 0;
foo1(a);
penso di aver capito ora, quindi quel parametro della funzione int &a all'interno del corpo della funzione si comporta come se fosse un puntatore.
void foo1(int *a)
{
...
}
in questo caso invece cosa bisogna passare nella chiamata della funzione foo1?
l'indirizzo di una variabile?
bancodeipugni
14-01-2014, 14:14
i passaggi in c sono solo per valore quelli per riferimento sono simulati
nella scrittura che hai scritto passi il puntatore al primo valore di a
vendettaaaaa
14-01-2014, 18:33
Non lo sono, la prima equivale a
int *m;
int n;
la seconda
int *m;
int *n;
E' il contrario :D
penso di aver capito ora, quindi quel parametro della funzione int &a all'interno del corpo della funzione si comporta come se fosse un puntatore.
Esatto, ma con la comodità di usare la notazione delle variabili normali. Detta più propriamente, la funzione prende in ingresso (perchè è lei che decide cosa prendere, nella dichiarazione della lista dei parametri) la variabile vera e propria, non una sua copia.
void foo1(int *a)
{
...
}
in questo caso invece cosa bisogna passare nella chiamata della funzione foo1?
l'indirizzo di una variabile?
Sì, un indirizzo. O un array (ma non un suo elemento):
int a[5] = { 1, 2, 3, 4, 5 };
foo1(a); // ok
foo1(a[2]); // errore
foo1(&a[2]); // ok
lorenzo001
14-01-2014, 19:30
E' il contrario :D
Sì ... che precisino ... :-)
Intendevo l'una e l'altra ... :-)
grazie mille per le risposte che mi avete dato tutti quanti, mi avete chiarito moltissime cose.
stavo provando a usare l'operatore & come parametro della funzione foo1(int &a) ma in c mi da errore, mentre in c++ no.
il gcc compila solo in c o è possibile anche compilare in c++? (e magari anche compilare altri linguaggi di programmazione? [ma è solo una curiosità])
vendettaaaaa
15-01-2014, 13:52
Il C non ha le reference
quindi la e commerciale ( & ) è chiamata operatore di referenziazione immagino :D
vendettaaaaa
16-01-2014, 18:40
In C & e' un operatore unario che estrai il l-value di una variabile.
In C++ se utilizzato nella dichiarazione di una funzione fa si che il compilatore implementi il passaggio per riferimento per quel parametro, ma comunque se applicato ad una variabile estrae comunque il l-value.
Nom so se usiamo lo stesso lessico, ma se applichi & ad una variabile (es: &a; // dopo aver dichiarato int a;) ne estrai l'indirizzo. Mentre se lo attacchi ad un tipo (int& a = b;) stai dichiarando che a è una Reference ad un l-Value di tipo int. Un l-Value è una variabile dichiarata esplicitamente, non temporanea.
int a = 6;
int& b = a;
int& c = 4; //errore: 4 è un int temporaneo senza nome, una Reference non può puntare ad esso.
int& d = rand(); //errore: anche i valori di ritorno delle funzioni sono dei temporanei (anche detti r-Value)
I nomi l e r-value indicano che la variabile può stare anche a sinistra di un uguale (un'assegnazione) o solo a destra. In altre parole, come è evidente, posso solo assegnare valori a variabili che hanno un nome (e quindi so dove andare a pescare in memoria); i temporanei sono oggetti anonimi sintetizzati dal compilatore e se assegnassi loro un valore non potrei cmq andare a leggerlo successivamente perché non hanno dei nomi.
Scusa la pappardella ma è indirizzata al giovane padawan, non a te :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.