Creare Videogiochi - Game Developer
[C++]Chiarimenti su una lezione della guida di HTML.it - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Programmazione (https://www.making-videogames.net/giochi/Forum-Programmazione)
+--- Forum: Programmazione in C C++ e C# (https://www.making-videogames.net/giochi/Forum-Programmazione-in-C-C-e-C)
+--- Discussione: [C++]Chiarimenti su una lezione della guida di HTML.it (/thread-C-Chiarimenti-su-una-lezione-della-guida-di-HTML-it)



[C++]Chiarimenti su una lezione della guida di HTML.it - ossen97 - 02-04-2011

Ciao a tutti! Volevo chiedere chiarimenti su questa lezione della guida di html.it: http://programmazione.html.it/guide/lezione/1175/chiamata-per-valore-e-per-indirizzo/
Vi ringrazio in anticipo, ciao!


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - Riddick - 02-04-2011

Ma fa pena questa guida....

Codice:
#include <iostream.h>

int moltiplica(int* x, int* y);
// Definizione del prototipo

main()
{
int a = 5;
int b = 6;
int risultato;

risultato = moltiplica(& a, & b);
cout << Il risultato della moltiplicazione è:
<< risultato <<endl;

return (0);
}


int moltiplica(int* x, int* y)
// Dichiarazione della funzione
{
int ris;

ris = *x * *y;
return ris;
// Valore restituito dalla funzione.
}

Ma sta usando il c++ o il c ? -.-

Leggiti questo manuale: http://www.mediafire.com/?kokm15ynzjt


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - ossen97 - 02-04-2011

Usa tutti e due. In base a come girava all'autore xD


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - steve - 02-04-2011

Anzitutto chiariamo definiamo meglio il concetto di variabile.
Quando dico int a = 10 il compilatore associa alla lettera "a" il valore 10, e se lo salva in un indirizzo di memoria.
Se io dico: int b = a il compilatore crea un nuovo spazio di memoria dove si salva b e gli associa il valore di a.
Se io dico: a=20 cambia solo il valore associato ad a, è vero che io avevo detto che b è uguale ad a, ma sono due variabili differenti.

Quando io creo una funzione con parametri avviene la stessa cosa:
Codice PHP:
#include <iostream>
using namespace std;
void crescente(int cint d);

int main()
{
int ab;
cout << "inserisci il valore di A : ";
cin >> a;
cout << "inserisci il valore di B : ";
cin >> b;
crescente(a,b);
cout << "ordine crescente: " << << " " << b;
return 
0;
}

void crescente(int c,int d)
{
if(
c>d)
{
int tmp c;
d;
tmp;
}


Le variabili c e d della funzione void ordina(int c, int d) sono in uno spazio di memoria differente rispetto quelle dichiarate nel main. Questo vuol dire che lo scambio non avviene.

Se scrivo: int a = 10; int *punt = &a; si creano sempre due spazi di memoria, ad a è associato 10 mentre a punt viene associato l'indirizzo di a.
Se ora scrivo *punt = 20; sto dicendo: modificami il valore che contiene quell'indirizzo di memoria (ovvero: modificami il valore di a).
In parole semplici è come dare due nomi alla stessa variabile, se io modifico *punt modifico anche a (e viceversa).
Quindi se riscrivo la funzione scambia in questo modo, funziona:

Codice PHP:
#include <iostream>
using namespace std;
void crescente(int *cint *d);

int main()
{
int ab;
cout << "inserisci il valore di A : ";
cin >> a;
cout << "inserisci il valore di B : ";
cin >> b;
crescente(&a,&b);
cout << "ordine crescente: " << << " " << b;
return 
0;
}

void crescente(int *c,int *d)
{
if(
c>d)
{
int tmp = *c;
*
= *d;
*
tmp;
}


Con il passaggio by reference a grandi linee avviene la stessa cosa.

Effettivamente su html.it non c'è proprio un buon esempio, il codice lì scritto si potrebbe fare anche senza puntatori, ma per fare una funzione di ordinamento di questo tipo è necessario utilizzare gli indirizzi di memoria; per approfondire meglio leggi le lezioni sui puntatori, sempre su html.it (o su altre guide che trovi).

Capito?


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - ossen97 - 02-04-2011

Non credo di aver capito molto bene :S A cosa serve mettere & e * prima dei nomi delle variabili? E poi scusa, se *punt = a, a non è uguale a *punt, quindi se modifico *punt non dovrebbe modificare anche a. O sbaglio?

EDIT: Rileggendo un attimo la lezione, ho capito di più. Ma ancora non mi è chiaro che differenza c'è tra chiamata per valore e per indirizzo.
EDIT2: L'asterisco (*) prima del nome significa che deve modificare il valore all'interno di quella variabile e che quindi se punt è uguale ad a modifico a e di conseguenza anche punt? :S


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - steve - 02-04-2011

La & indica l'indirizzo della variabile (è un valore esadecimale).
esempio:
Codice PHP:
int a 10;
cout << "la variabile a risiede nell'indirizzo " << &a// ti uscirà un valore del tipo: 001AF928 

Il * indica che è un puntatore, scrivendo:
(così si capisce meglio come funziona un puntatore)
Codice PHP:
int a 10;
int *= &a//puntatore a intero
cout << "la variabile a risiede nell'indirizzo " << &<< enld;
cout << "la variabile p risiede nell'indirizzo " << &<< " ma punta a " << p

Scrivendo *p dico di darmi (o sovrascrivere) il valore che punta (ovvero il valore di a, 10)
Codice PHP:
int a 10;
int *= &a;
cout << "a = " << << endl;
cout<< "*p = " << *<< endl << endl;
20;
cout << "a = " << << endl;
cout<< "*p = " << *<< endl << endl;
*
30// dire *p è come dire a... ho dato due nomi alla stessa variabile
cout << "a = " << << endl;
cout<< "*p = " << *<< endl


Nella chiamata per valore avviene una cosa del genere: int a = 10; int b = a; (solo scritta tramite funzione).
Creo una copia della variabile a, ma rimangono due variabili differenti... hanno solo lo stesso valore.


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - ossen97 - 02-04-2011

Chiaro grazie Steve! Big Grin

Ma se io scrivo:

int a = 2;
int b = 3;
int c = 4;

prova(d,e)


Le variabili 'd' ed 'e' che valori avranno?


RE: [C++]Chiarimenti su una lezione della guida di HTML.it - steve - 02-04-2011

Devi fare una cosa del genere:

Codice:
int main(){
...
int a, b, c;
...
prova(a,b);
...
}

prova(int c, int d)
{
...
}

Non puoi passare a una funzione dei valori non ancora dichiarati. Al massimo puoi fare: prova(10,15); (che è come fare: int a=10; int b=15; prova(a,b); )