Université de Savoie, UFR SFA INFO523
L3 INFO 2013–2014
TD 2, Pointeurs et passage de paramètres en C
On rappelle qu’un pointeur p peut être affiché avec l’option %p dans la chaı̂ne de caractère donnée à
printf.
Exercice 1 : Longueur d’une chaı̂ne
Ecrire la fonction strlen avec des pointeurs : celle-ci retourne la longueur d’une chaı̂ne de caractères
terminée par 0.
Exercice 2 : Fonction permutation de trois variables
Faire la fonction permute, l’équivalent de x, y, z 7→ y, z, x. Ecrire l’appel avec les variables i, j, k.
Est-ce que le code suivant sera autorisé ?
int tab[ 5 ];
permute( tab[ 0 ], tab[ 2 ], tab[ 4 ] );
Ou celui-ci :
int tab[ 5 ];
permute( tab, tab + 2, tab + 4 );
Ou encore
int tab[ 5 ];
permute( &tab[ 0 ], &tab[ 2 ], &tab[ 4 ] );
Exercice 3 : Comparaison de deux chaı̂nes de caractères
Ecrire la fonction int compare( char* p, char* q, int n ) qui calcule l’ordre lexicographique
des chaı̂nes p et q, mais limité aux n premiers caractères des chaı̂nes. La fonction retourne 0 si les
chaı̂nes sont égales (sur les n premiers caractères), un nombre strictement positif si p > q et strictement
négatif si p < q. Ne se servir que de pointeurs.
Exercice 4 : Pointeurs et tableaux
Que fait le code suivant ?
#include <stdio.h>
#include <string.h>
int compare( char* p, char* q, int n );
int h( char* p, char* q )
{
int s = 0;
while ( p != q )
s += *p++;
return s;
}
int trouve( char p1[], char p2[] )
{
1
char* p = p1;
int l = strlen( p );
int l2 = strlen( p2 );
l -= l2;
if ( l < 0 ) return -1;
int h1 = h( p, p + l2 );
int h2 = h( p2, p2 + l2 );
while ( l >= 0 )
{
if ( ( h1 == h2 ) && ! compare( p, p2, l2 ) )
return p - p1;
h1 -= *p;
h1 += *(p+l2);
++p;
--l;
}
return -1;
}
int main()
{
char s1[] = "youpi";
char s2[] = "entropie";
char s3[] = "mecanique";
char s4[] = "piyou";
printf( "h(%s) = %d\n", s1, h( s1, s1 + 5 ) );
printf( "h(%s) = %d\n", s2, h( s2, s2 + 8 ) );
printf( "h(%s) = %d\n", s3, h( s3, s3 + 9 ) );
printf( "h(%s) = %d\n", s4, h( s4, s4 + 5 ) );
char s[] = "Il n’est d’entropie que dans l’allegresse : youpi, s’exclame la belle mecanique, je v
printf( "%s\n", s );
printf( "i(%s) = %d\n", s1, trouve( s, s1 ) );
printf( "i(%s) = %d\n", s2, trouve( s, s2 ) );
printf( "i(%s) = %d\n", s3, trouve( s, s3 ) );
printf( "i(%s) = %d\n", s4, trouve( s, s4 ) );
return 0;
}
Ce programme s’exécute ainsi :
h(youpi) = 566
h(entropie) = 870
h(mecanique) = 952
h(piyou) = 566
Il n’est d’entropie que dans l’allegresse : youpi, s’exclame la belle mecanique, je vais pouvoir ap
i(youpi) = 44
i(entropie) = 11
i(mecanique) = 70
i(piyou) = -1
Que fait donc ce programme ? Marchera-t-il pour n’importe quelle chaı̂ne de caractères ?
Exercice 5 : Tableaux de pointeurs
2
Les arguments donnés à un programme sont fournis sous forme d’un tableau de pointeurs vers des
chaı̂nes de caractères.
int main( int argc, char* argv[] )
{
}
Le paramètre argc donne la taille du tableau lui-même.
Ecrire une fonction qui crée une nouvelle chaı̂ne de caractères, allouée dynamiquement, qui est la
concaténation de toutes les chaı̂nes données en paramètres (sous forme de tableau de chaı̂ne).
char* create_concat( int n, char* strs[] ) ...
Appeler cette fonction dans le main sur les paramètres sauf le premier (c’est le nom du programme),
afficher la chaı̂ne, et désallouer-là correctement.
Exercice 6 : Structures et pointeurs
On définit la structure Point ainsi :
struct SPoint {
double x;
double y;
};
typedef struct SPoint Point;
Ecrire la fonction creer qui retourne un Point initialisé aux deux coordonnées passées en paramètres.
Ecrire maintenant la fonction reinitialiser qui modifie un Point pour mettre ses coordonnées
à zéro.
Ecrire la fonction qui calcule la distance entre deux points. Faut-il un passage par valeur ou par
adresse ?
Ecrire la fonction qui réalise la translation d’un point. Faut-il un passage par valeur ou par adresse
?
Exercice 7 : Tableaux à deux dimensions
Que vaut le tableau à l’issue de ces lignes ?
int tab[3][5];
int *a = *tab, i, j;
for (i=0 ; i<15 ; *a++ = i++);
**tab = 15;
**(tab+1) = 16;
*(tab[0]+1) = 17;
*(*tab+8) = 18;
*(tab[2]+3) = 21;
*(*(tab+2)+2) = 22;