Déjà ton code est zarb, c'est censé être du C++? Alors déjà tu utilises #include <string> et pas string.h, ensuite tu utilises les string et pas des tableaux de char. Et puis utilise pas "using namespace::std;" parce que le jour où tu seras obligé de l'enlever t'oublieras de mettre std:: devant chaque nom d'entité standard.
Ensuite, quelques problèmes dans la structure du code: avec ton while(), tu fais déjà un premier test de ch alors qu'il n'est même pas initialisé! Il pourrait contenir n'importe quoi, du coup, le fait que tu rentres dans le while ou pas est complètement aléatoire, selon la zone de mémoire dont tu as hérité contenait quelque-chose qui correspondrait à des paranthèses dans une chaîne de caractères ou pas. Donc, utilise plutôt un do {} while() pour initialiser ta chaîne une première fois avec saisir() ou alors fais un appel à saisir() une seule fois avant ta boucle pour l'initialiser.
Ensuite, tu fais un appel à verifpar() dans le while() et ensuite tu le refais dans le bloc appelé par le while, ça sert à rien! mettre un saisir() dans le bloc suffira amplement.
Enfin, la condition du while ne fera pas ce à quoi tu t'attends: la boucle va s'exécuter seulement si verifpar() renvoie vrai, or verifpar() envoie vrai si... il y autant de paranthèses ouvrantes que de fermantes!
Enfin, aucun besoin de pointeurs ou de références ici mais je vais quand même t'expliquer un peu. On va déjà commencer par le pointeur.
Alors, un pointeur c'est une variable qui contient un nombre (en héxadécimal). Ce nombre est interprété comme une adresse: c'est la location d'une autre variable dans la mémoire, c'est-à-dire que si tu stockes dans un pointeur la location d'une autre variable, tu pourras stocker cette variable et l'utiliser depuis quelque-part d'autre sans stocker la variable en elle-même, mais seulement le pointeur!
Des cas où le pointeur est utile c'est par exemple si tu veux stocker une même variable dans plusieurs conteneurs: tu stockes la variable en elle-même dans un conteneur, et un pointeur vers cette variable dans un autre, comme ça tu n'as pas besoin de stocker la variable 2 fois dans chaque conteneur (pour un grand tableau, ça utiliserait beaucoup de place si la variable est une grosse structure par exemple, alors qu'avec un pointeur ca fait juste un nombre de plus à stocker). En plus, le fait de modifier la variable depuis le 1e conteneur ou la variable pointée par le pointeur dans le second conteneur auraient le même effet.
Syntaxiquement, le pointeur s'utilise ainsi:
int var(3);
int *ptr = &var;
L'astérisque (*) après un type permet de spécifier que c'est un pointeur vers ce type (dans ce cas int* veut dire "pointeur vers un int").
L'esperluette, elle, renvoie l'adresse d'une variable (&var renvoie l'adresse dans laquelle var est stockée. Tu peux essayer de l'afficher avec std::cout par exemple pour t'en rendre compte)
Ensuite, une fois que tu as le pointeur, tu peux aller chercher la variable dont l'adresse est stockée de la sorte:
par exemple, tu peux faire que var soit égal à 4 en faisant:
(*ptr)++; //(je mets les paranthèses pour que ce soit clair)
La référence est exactement comme un pointeur, sauf qu'elle est syntaxiquement plus légère mais aussi plus ambigüe:
en prenant l'exemple du dessus avec des références:
int var(3);
int &ref = var;
ref++;
La référence est intelligente, et prend automatiquement l'adresse d'une variable lors de l'assignement, et déréférence (avec un pointeur on déférence en faisant *ptr) automatiquement lors d'un appel de fonction.