Vous êtes sur la page 1sur 3

TP Pointeurs et chaînes de caractères

ARITHMÉTIQUES DES POINTEURS

A) Affectation par un pointeur sur le même type


Soient p1 et p2 deux pointeurs sur le même type de données, alors l'instruction
p1 = p2;
fait pointer p1 sur le même objet que p2.

B) Addition et soustraction d'un nombre entier


Si p pointe sur l'élément A[i] d'un tableau, alors

p+n pointe sur A[i+n]


p–n pointe sur A[i–n]

C) Incrémentation et décrémentation d'un pointeur


Si p pointe sur l'élément A[i] d'un tableau, alors après l'instruction
p++; p pointe sur A[i+1]
p=p+n; p pointe sur A[i+n]

p--; p pointe sur A[i-1]

p=p-n; p pointe sur A[i-n]

Domaine des opérations


L'addition, la soustraction, l'incrémentation et la décrémentation sur les pointeurs sont seulement
définies à l'intérieur d'un tableau. Si l'adresse formée par le pointeur et l'indice sort du domaine du
tableau, alors le résultat n'est pas défini. Seule exception: Il est permis de 'pointer' sur le premier
octet derrière un tableau (à condition que cet octet se trouve dans le même segment de mémoire que
le tableau). Cette règle, introduite avec le standard ANSI-C, légalise la définition de boucles qui
incrémentent le pointeur avant l'évaluation de la condition d'arrêt.
Exemple:
int A[10];
int *P;
P = A+9; /* dernier élément -> légal */
P = A+10; /* dernier élément + 1 -> légal */
P = A+11; /* dernier élément + 2 -> illégal */
P = A-1; /* premier élément - 1 -> illégal */

D) Soustraction de deux pointeurs


Soient p1 et p2 deux pointeurs qui pointent dans le même tableau:
p1-p2 fournit le nombre de composantes entre p1 et p2
Le résultat de la soustraction P1-P2 est
● négatif si p1 précède p2
● zéro si p1 = p2
● positif si p2 précède p1
● indéfini si p1 et p2 ne pointent pas dans le même tableau

Plus généralement, la soustraction de deux pointeurs qui pointent dans le même tableau est
équivalente à la soustraction des indices correspondants.
E) Comparaison de deux pointeurs
On peut comparer deux pointeurs par : <, >, <=, >=, ==, !=.
La comparaison de deux pointeurs qui pointent dans le même tableau est équivalente à la
comparaison des indices correspondants. (Si les pointeurs ne pointent pas dans le même tableau,
alors le résultat est donné par leurs positions relatives dans la mémoire).

Consigne: Tous les exercices devront se faire en utilisant l’arithmétique des pointeurs. En
particulier, vous ne devrez pas utiliser d’indices pour accéder aux éléments des tableaux.

Exercice 1
Soit P un pointeur qui 'pointe' sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Quelles valeurs ou adresses fournissent ces expressions:
a) *P+2
b) *(P+2)
c) &P+1
d) &A[4]-3
e) A+3
f) &A[7]-P
g) P+(*P-10)
h) *(P+*(P+8)-A[7])
Exercice 2
Écrire la fonction sommeEtMultiplie calculant la somme et le produit de deux réels passés en
paramètres, puis un programme qui utilise cette fonction. Pour cela vous écrirez votre code dans un
fichier sommemult.c:
void sommeEtMultiplie ( float a , float b , float *somme, float *mult );

Exercice 3: Conversion en binaire


On veut convertir un nombre décimal en binaire selon la méthode suivante:
1. Tant que le nombre décimal est différent de zéro, on le divise par deux et on met le reste de la
division dans un tableau.
2. On inverse les élément du tableau.
Exemple: le nombre 13 vaut 1101 en binaire

1. Ecrire une fonction inverser qui permet d’inverser les éléments d’un tableau.
2. Ecrire une fonction convertir qui permet de convertir un nombre décimal en binaire.
3. Ecrire une fonction affiche qui affiche les éléments d’un tableau.
4. Ecrire le programme principal.

les prototypes des fonctions:


void inverser(int *tab, int nb);
void convertir (int dec, int *bin, int *nb);
void affiche (int *tab, int nb);

Exercice 4
Déterminez le résultat de l'exécution du programme suivant sans le compiler:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void)
{
char s1[] = "bonne";
char s2[] = "journee";
char resul[] = "...........";

strcpy( resul+2, s1 );
strncpy( resul+5, s2, 4 );

printf( "%s \n", resul );


return EXIT_SUCCESS;
}
Exercice 5
Coder une fonction qui inverse lettre à lettre une chaîne de caractères (sans utiliser de fonctions de
la bibliothèque standard, y compris strlen). La chaîne « étira » sera par exemple inversée en « arité».
Pour information, une chaîne de caractères se termine par le caractère ’\0’. Le prototype de la
fonction est le suivant : void inverseChaine ( char *in , char *out );

Exercice 6
NB: On appelle palindrome une suite de caractères qui se lit de la même façon dans les deux sens:
de droite à gauche ou de gauche à droite. (laval, aziza, ressasser …)

1. Écrire une fonction "palindrome" qui reçoit en argument une chaîne de caractères (un mot),
puis retourne 1 si cette chaîne est un palindrome, sinon retourne 0.
2. Écrire un programme qui lit une chaîne de caractères et fait appel à la fonction "palindrome"
pour déterminer si cette chaîne est un palindrome ou non.

Vous aimerez peut-être aussi