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,