Questo codice è quello corretto:
L'errore principale era algoritmico non sui puntatori(poi c'era una svista sui puntatori sul tuo codice che ti spiego dopo), nel tuo algoritmo cerca num in pseudo_codice veniva questo:codice:#include<stdio.h> #include <stdlib.h> #define M 3 int inserire_num(void); int *cerca_num(int , int *); main(){ int a[M] = { 2, 3, 5 }; int *p; int num; num = inserire_num(); p = cerca_num(num, a); if(p != 0 ) printf("il numero cercato %d si trova nella sequenza.\n\n", *p); else printf("Il numero %d non si trova nella sequenza.\n\n", num); system("PAUSE"); } int inserire_num(){ int n; printf("Inserire un numero da cercare: "); scanf("%d", &n); return n; } int *cerca_num(int nn, int *ar){ int *pA = 0; int i; for(i = 0; i< M; i++){ if(*(ar+i) == nn) { pA = &nn; break; } } return pA; }
i è 0
se in ar[i] c'è nn
pA punterà a nn
sennò pA punterà all'indirizzo 0
i è 1
se in ar[i] c'è nn
pA punterà a nn
sennò pA punterà all'indirizzo 0
i è 2
se in ar[i] c'è nn
pA punterà a nn
sennò pA punterà all'indirizzo 0
Quindi il tuo è un ciclo che continua fino alla fine cmq, quindi se tu inserisci il 5 dopo non ha altri controlli da fare, che, se il numero è stato trovato prima, vanno a modificare pA; quindi lo trova. Se tu inserisci 2 alla prima iterazione pA punterà a nn, ma dopo il ciclo continua e darà il risultato del confronto col l'ultimo valore dell'array; per evitare questo ho dato a pA subito il valore flag(zero) e messo un break nel caso venga trovato il numero in modo da non confrontare con gli eventuali indici che avanzano.
L'errore con puntatori è il seguente:
tu dai a pA il seguente valore:
pA = 0
in questo modo non sarà il valore puntato da pA ad essere modificato, ma l'indirizzo a cui punta pA, infatti a debug viene lanciato un acces violation perchè tu fai il seguente controllo:
if(*p != 0)
ma in questo modo controlli la variabile puntata da pA, quindi dovevi assegnare 0 a *pA dereferendiando con *.
Per capire bene il discorso, prova a fare questo:
Con * dereferenzi il puntatore e quindi è come trattare la variabile puntata, scrivere *puntatore è come scrivere intero, scrivere puntatore invece è una variabile apparte che memorizza l'indirizzo di intero e quindi se gli dai il valore 0 cerca di modificare e leggere uno spazio di memoria inesistente o occupato.codice:... int intero = 50; int* puntatore = &intero; printf("%x\n", puntatore); printf("%d\n", *puntatore); ...
Spero di essere stato chiaro,
![]()

Rispondi quotando