mercredi 6 avril 2011

Exercices Corrigés Langage C : ARITHMETIQUE DES POINTEURS - ALLOCATION DYNAMIQUE

Exercice 1:

adr1 et adr2 sont des pointeurs pointant sur des réels. Le contenu de adr1 vaut -45,78; le contenu de adr2 vaut 678,89.
Écrire un programme qui affiche les valeurs de adr1, adr2 et de leur contenu.

Exercice 2 :


pi est un pointeur sur un entier;  pi vaut 0x5000 et son contenu vaut 300. 
Ecrire le programme correspondant (programme dangereux sous WONDOWS).
L'opérateur de "cast", permet d'autre part, à des pointeurs de types différent de pointer sur la même adresse.
Exemple : 

char *pc;/* pc pointe sur un objet de type caractère */
int *pi;/* pi pointe sur un objet de type entier */
pi = (int*)malloc(4) ;  /* allocation dynamique pour i */
pc = (char*)i;/* c et i pointent sur la même adresse, c sur un caractère  */


Exercice 3 :

adr_i est un pointeur de type entier; son contenu i vaut 0x12345678. A l'aide d'une conversion de type de pointeur, Ècrire un programme montrant le rangement des 4 octets en mémoire.

Exercice 4 :


Saisir un texte. Ranger les caractères en mémoire. Lire le contenu de la mémoire et y compter le nombre d'espaces et de lettres e .

Exercice 5 :


Saisir 6 entiers et les ranger à partir de l'adresse adr_deb. Rechercher le maximum, l'afficher ainsi que son adresse.
-------------------------------------------------------------------------------------------------------
Correction
-------------------------------------------------------------------------------------------------------

Exercice 1 :

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
float *adr1,*adr2;
adr1 = (float*)malloc(4);
adr2 = (float*)malloc(4);
*adr1 = -45.78;
*adr2 = 678.89;
printf("adr1 = %p adr2 = %p r1 = %f r2 = %f\n",adr1,adr2,*adr1,*adr2);
free(adr1);
free(adr2);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}


Exercice 2 :

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
int *i;
i = (int*)malloc(4);
*i = 300;
printf(" adresse = %p   variable = %d\n",i,*i);
free(i);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}


Exercice 3 :

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
char *adr_c;
int *adr_i,i=0x12345678;
adr_i = &i;
adr_c = (char*)adr_i;
printf("ADRESSE: %p CONTENU: %x\n",adr_c,*adr_c);
printf("ADRESSE: %p CONTENU: %x\n",adr_c+1,*(adr_c+1));
printf("ADRESSE: %p CONTENU: %x\n",adr_c+2,*(adr_c+2));
printf("ADRESSE: %p CONTENU: %x\n",adr_c+3,*(adr_c+3));
getch();
}

L'analyse de l'exécution en BORLANC C++, montre que les microprocesseurs INTEL rangent en mémoire d'abord les poids faibles d'une variable.


Exercice 4 :

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
char *adr_deb,c;
int i,imax,compt_e = 0,compt_sp = 0;
adr_deb = (char*)malloc(30);/* texte d'au plus 30 caracteres */
 
/* saisie et rangement du texte */
printf("\nADRESSE DU TEXTE: %p (ATTRIBUEE PAR LE COMPILATEUR)",adr_deb);
printf("\nENTRER UN TEXTE: ");
for (i=0;((c=getchar())!='\n');i++) *(adr_deb + i) = c;
imax = i;/* borne superieure */
 
/* lecture de la memoire et tri */
for (i=0;i<imax;i++)
       {
       c = *(adr_deb+i);
       printf("\nCARACTERE: %c ADRESSE: %p",c,adr_deb+i);
       if (c= ='e') compt_e++;
       if (c= =' ') compt_sp++;
       }
 
/* resultats */
printf("\nNOMBRE DE e: %2d NOMBRE d'espaces: %2d\n",compt_e,compt_sp);
free(adr_deb);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}


Exercice 5 :

#include  <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
int *adr_deb,*adr_max,i,imax=6,max;
adr_deb=(int*)malloc(4*6);
printf("\nADRESSE DE BASE: %p (CHOISIE PAR LE PROGRAMMEUR)\n",adr_deb);
/* saisie des nombres */
printf("SAISIE DES NOMBRES: \n");
for(i=0;i<imax;i++)
{
       printf("ENTRER UN NOMBRE: ");
       scanf("%d",adr_deb+i);
       }
 
/* tri */
max = *adr_deb;
adr_max = (int*)adr_deb;
for(i=0;i<imax;i++)
{
if(*(adr_deb+i)>max)
       {
       max = *(adr_deb+i);
       adr_max =  adr_deb+i;
       }
}
/* resultats */
printf("LE MAXIMUM:%d  SON ADRESSE:%p\n",max,adr_max);
free(adr_deb);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE");
getch();
}

0 commentaires:

Enregistrer un commentaire

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites

 

IP