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.
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.
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.
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 :
Exercice 2 :
Exercice 3 :
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()
{
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();
}
#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();
}
#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();
}
#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 */
#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 */
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++;
}
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();
}
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();
}
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();
}
Article plus récent Article plus ancien