Questo codice è quello corretto:
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;
}
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:
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:
codice:
...
int intero = 50;
int* puntatore = &intero;
printf("%x\n", puntatore);
printf("%d\n", *puntatore);
...
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.
Spero di essere stato chiaro,