Oppure

Loading
29/11/09 18:47
Luca90
Ciao a tutti!Scusate, sto lavorando con i puntatori, cercando di linkarlo al primo elemento di un array, e successivamente incrementarlo per stampare gli elementi successivi. il primo lo stampa correttamente, ma quando incremento, i valori non coincidono più. Potreste darmi una mano? Grazie in anticipo(Ps. se potete, scrivereste anche una leggera descrizione dell'operatore * per i puntatori?se lo uso in printf mi dice segmentation fault in esecuzione).
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
int array[3]={5,14,20},i;
int *arrayPnt;

arrayPnt =array[0];

for(i=0; i<3; ++i){
	printf("| %d |", array[i]);
}

printf("\n| %p |", arrayPnt);
printf("| %p |", arrayPnt+1);
printf("| %p |\n", arrayPnt+2);

return 0;
}
aaa
29/11/09 19:03
eddiewrc
prima di tutto, il C si studia sui manuali e non sui forum, xche è un ulinguaggio serio. l'operatore * (di dereferenziazione) applicato a un indirizzo di memoria ne restituisce il contenuto

il tuo codice è sbagliato:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
int array[3]={5,14,20},i;
int *arrayPnt;

/*arrayPnt =array[0]; ERRORE!!
stai facendo puntare arrayPnt NON all'indirizzo di array ma alla cella di memoria corrispondente al contenuto della prima cella del tuo array. risultato: INCOERENZA dell'esecuzione*/
//quello che volevi fare è:
arrayPnt = array;


for(i=0; i<3; ++i){
printf("| %d |", array[ i ]);
}
/* queste stampe ti restituiranno solo valori numerici apparentemente sconclusionati, infatti stai chiedendo (con il %p) di stampare l'indirizzo a cui punta il tuo puntatore, e non il contenuto della cella di memoria puntata
printf("\n| %p |", arrayPnt);
printf("| %p |", arrayPnt+1);
printf("| %p |\n", arrayPnt+2);
un ciclo che stampa correttamente è:*/
for (i = 0; i < 3 i++)
printf("valore %d: %d", i, *(arrayPnt + 1) );// puoi anche fare un cast ma nn serve

return 0;
}

i puntatorei sono la cosa migliore del C, ma anche la cosa più complessa! studia su un manuale!
ciao!
Ultima modifica effettuata da eddiewrc 29/11/09 19:03
aaa
29/11/09 19:13
Luca90
Ok grazie!Ho già un manuale, so che senza non si può fare...Non riuscivo a capirlo da li semplicemente...comunque grazie ora ho capito e va
aaa
29/11/09 22:35
TheKaneB
Giusto per dare un po' di spunti di studio al nostro amico Luca90...

/* Dichiarato un array... */
int mioArray[3];

/* ... i seguenti costrutti sono equivalenti */
int *pArray1 = &mioArray;
int *pArray2 = &mioArray[0];
int *pArray3 = mioArray;


pArray1 punta chiaramente all'indirizzo dell'array.
pArray2 punta al primo elemento dell'array, che coincide con l'indirizzo dell'array stesso.
pArray3 è una copia dell'array. Quest'ultimo caso è più complicato, ma in sostanza viene effettuato un cast implicito da array di int a puntatore a int, e risulta quindi equivalente a pArray1, dove il cast invece era esplicito (a causa dell'operatore &, chiamato anche address_of).

In linea di principio bisogna fare attenzione alla dualità array-puntatore, perchè molto comoda ma anche pericolosa se non si sa come gestire la situazione. Il risultato netto di questa dualità è che, anche se da un punto di vista sintattico sono presenti, in pratica gli array in C è come se non esistessero, perchè nelle conversioni decadono sempre al puntatore corrispondente.

Ciao!
aaa