Vous êtes sur la page 1sur 3

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;

Vous aimerez peut-être aussi