|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
[c++] * e ** ???
int x=20; //crea variabile intera x che vale 20
int *puntx=& x; // l'indirizzo di memoria dove era la variabile x è diventato il valore della variabile puntx *puntx=10; //la variabile x viene modificata e non vale più 20 ma 10. è corretto? inoltre spesso nei listati vedo **. a che servono nei puntatori?
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII Ultima modifica di vermaccio : 04-05-2006 alle 11:15. |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Esempio: Codice:
int x = 20; int *px = &x; int **ppx = &px; **ppx = 10;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
int x = 20; //assegna alla variabile x il valore 20
int *px = &x; //assegna alla variabile di tipo puntatore px l'indirizzo della cella di memoria in cui è la variabile x int **ppx = &px; //che assegna? e int *punt = &px; //ha senso?
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII |
|
|
|
|
|
#4 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
In pratica si assegna alla variabile ppx l'indirizzo del puntatore px. px è una variabile come le altre, quindi anch'essa ha un suo indirizzo. Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
questo, se ho ben capito, perchè px è una variabile puntatore e non una variabile nel senso stretto.
infatti è diverso dire int x; e int *px; quindi , per "estrarre" l'indirizzo, quando ho una "int" userò "*". mentre se ho una "int*" userò "**". int x --> *px=&x int* px --> int **ppx = &px esatto? ma... se punto alla ppx... che metto TRE *? int ***pppx = &ppx ????
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII Ultima modifica di vermaccio : 04-05-2006 alle 12:03. |
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
mi spiego meglio:
int x=20; //e ipotizziamo che l'indirizzo di memoria dove è stoccata la x sia 7500 int *px=&x; //cioè px vale 7500 ma la variabile px è stoccata, ad esempio, in indirizzo di memoria 8500 int **ppx = &px; //cioè ppx vale 8500 ma la variabile ppx è stoccata, ad esempio, in indirizzo di memoria 9500 *px=10; //la variabile x viene modificata e non vale più 20 ma 10. x=x+5: //la variabile x ora vale 15. tutto esatto?
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Prova questo "esercizio" sui puntatori ...
Codice:
void funz (int **pa, int **pb)
{
int *pt;
pt = *pa;
*pa = *pb;
*pb = pt;
}
int main (void)
{
int a = 10;
int b = 20;
int *p1 = &a;
int *p2 = &b;
/* Qui p1 punta ad 'a', p2 punta a 'b' */
funz (&p1, &p2);
*p1 = 55;
*p2 = 99;
/* Cosa contengono a e b ?? */
/* Cosa fa la funz() ?? */
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Scusa andbin ma quando ad esempio tu hai fatto:
int *p1 = &a; è uguale a scrivere: int *p1; p1=&a; giusto? |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
Codice:
void funz (int **pa, int **pb)
{
int *pt;
pt = *pa;
*pa = *pb;
*pb = pt;
}
int main (void)
{
int a = 10;
int b = 20;
int *p1 = &a;
int *p2 = &b;
/* Qui p1 punta ad 'a', p2 punta a 'b' */
funz (&p1, &p2);
*p1 = 55;
*p2 = 99;
/* Cosa contengono a e b ?? */
/* Cosa fa la funz() ?? */
return 0;
}
poi b=55 e a=99 perchè i puntatori sono stati invertiti prima della riassegnazione. esercizio illuminante! grazie sei sempre un mito! (e mi sta simpatico anche il gatto)
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII Ultima modifica di vermaccio : 04-05-2006 alle 16:39. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
int x=20; //crea variabile intera x che vale 20
int *puntx=& x; // l'indirizzo di memoria dove era la variabile x è diventato il valore della variabile puntx 1) ma se io per motivi di programmazione conoscessi solo *puntx come stampo il valore "20" a cui punta il puntatore *puntx? 2)se ho una funzione: void funzione (....., double* &variabile,...) (notare la "&") In questa funzione ho un ciclo for che riempie l'array "variabile" for(int i=0; .....){ variabile[i]=qualcosa } Se io richiamo la funzione dal main tramite double *puntx funzione(..., puntx,...) io ottengo la variabile puntx che è un array(?) di puntatori ai valori "qualcosa". se voglio stampare a video i "qualcosa" come faccio se sono double? printf("puntx: %g\n", puntx); ???????
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII Ultima modifica di vermaccio : 09-05-2006 alle 11:24. |
|
|
|
|
|
#14 | ||||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
Ti faccio un esempio più chiaro: Codice:
void funz (double *ptr) /* ottengo un puntatore */
{
int i;
for (i = 0; i < 10; i++)
ptr[i] = i+1; /* ptr[i] equivale a *(ptr+i) cioè accede all'elemento di indice 'i' !!! */
}
int main (void)
{
int i;
double arr[10]; /* definisco un array di 10 double */
funz (arr); /* passo a funz l'indirizzo del primo elemento!! */
for (i = 0; i < 10; i++)
printf ("%f ", arr[i]); /* stampa elemento */
return 0;
}
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||||
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
eccoil mio dilemma
void funz (double* &ptr) { int i; for (i = 0; i < 10; i++) ptr[i] = 100+i; //100, 101, .. ,110 } int main (void) { int i; double* nuovo; funz (nuovo); //ora che contiene nuovo? come stampo il contenuto? return 0; }
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
Quote:
ptr[i], variando i da 0 a 10 varrà 1,2,...11 la funzione passa all'esterno "double *ptr" ovvero il puntatore al primo elemento che vale 1. quando fuori della funzione stampo "printf ("%f ", arr[i]);" verrà stampato 1,2...,11. esatto? (questi puntatori mi stanno facendo impazzireeeeeeee)
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII |
|
|
|
|
|
|
#17 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
con double *nuovo hai dichiarato un puntatore ma senza dargli un valore. Non è inizializzato, in pratica. Molto probabilmente contiene schifezze, quindi non sai a cosa punta. Se anche puntasse a qualcosa di valido ... l'unica cosa certa è che funz cercherebbe di scrivere su 10 double a partire dall'indirizzo passato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 10.000000
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 2141
|
bel casino.
allora. facciamo chiarezza. tutto è iniziato perchè ho una funzione fatta così. void funz (double* &ptr) { int i; for (i = 0; i < 10; i++) ptr[i] = 100+i; //100, 101, .. ,110 } per attivarla ho pensato bene di fare nel main double* nuovo; funz (nuovo); però non riuscivo poi a stampare il contenuto di nuovo che in teoria doveva contenere puntatori ai valori creati nella funzione. però se ho ban capito così non va bene. allora che devo dare in pasto alla funzione? la devo richiamare come dal main infilandogli dentro che double? creato come?
__________________
..strisc...strisc...oooooOOoooO http://digilander.iol.it/pentiumII Navi da battaglia giapponesi classe Yamato WWII |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
void funz (double* ptr)
{
int i;
for (i = 0; i < 10; i++)
ptr[i] = 100+i; //100, 101, .. ,109
}
Alla funzione dovrai passare un puntatore tale per cui punti ad una zona di memoria valida in cui ci sia spazio per 10 double. Il modo più semplice è passare l'indirizzo di un array di double!!! Codice:
double arr[10]; funz (arr); Codice:
double *punt; punt = (double*) malloc (10*sizeof (double)); funz (punt);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:40.



















