Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Array e puntatori
Forum - C/C++ - Array e puntatori

Avatar
Luca90 (Normal User)
Newbie


Messaggi: 8
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 19:47
Domenica, 29/11/2009
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).
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(){
  6. int array[3]={5,14,20},i;
  7. int *arrayPnt;
  8.  
  9. arrayPnt =array[0];
  10.  
  11. for(i=0; i<3; ++i){
  12.         printf("| %d |", array[i]);
  13. }
  14.  
  15. printf("\n| %p |", arrayPnt);
  16. printf("| %p |", arrayPnt+1);
  17. printf("| %p |\n", arrayPnt+2);
  18.  
  19. return 0;
  20. }


PM Quote
Avatar
eddiewrc (Member)
Expert


Messaggi: 560
Iscritto: 30/04/2006

Segnala al moderatore
Postato alle 20:03
Domenica, 29/11/2009
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 il 29/11/2009 alle 20:03


La conoscenza non ha mai fatto del male a nessuno. Caso mai hanno fatto del male quelli che hanno impiegato MALE la loro conoscenza. La conoscenza deve essere libera e quando dico libera intendo "free as freedom" e non "free as a free beer".
PM Quote
Avatar
Luca90 (Normal User)
Newbie


Messaggi: 8
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 20:13
Domenica, 29/11/2009
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

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 23:35
Domenica, 29/11/2009
Giusto per dare un po' di spunti di studio al nostro amico Luca90...

Codice sorgente - presumibilmente C++

  1. /* Dichiarato un array... */
  2. int mioArray[3];
  3.  
  4. /* ... i seguenti costrutti sono equivalenti */
  5. int *pArray1 = &mioArray;
  6. int *pArray2 = &mioArray[0];
  7. 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!


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote