نسمة طيف
اهلا وسهلا بك زائرنا الكريم
منتديات نسمة طيف ترحب بك أجمل ترحيب
ونتمنى لك وقتاً سعيداً مليئاً بالحب كما يحبه الله ويرضاه
فأهلاً بك في هذا المنتدى المبارك إن شاء الله
ونرجوا أن تفيد وتستفيد منا
وشكراً لتعطيرك المنتدى بباقتك الرائعة من مشاركات مستقبلية
لك منا أجمل المنى وأزكى التحيات والمحبة
نسمة طيف
اهلا وسهلا بك زائرنا الكريم
منتديات نسمة طيف ترحب بك أجمل ترحيب
ونتمنى لك وقتاً سعيداً مليئاً بالحب كما يحبه الله ويرضاه
فأهلاً بك في هذا المنتدى المبارك إن شاء الله
ونرجوا أن تفيد وتستفيد منا
وشكراً لتعطيرك المنتدى بباقتك الرائعة من مشاركات مستقبلية
لك منا أجمل المنى وأزكى التحيات والمحبة
نسمة طيف
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

نسمة طيف

منتدى عربي يشمل جميع المواضيع اهلا بيكم في منتدى نسمة طيف
 
الرئيسيةدخولأحدث الصورالتسجيل
المواضيع الأخيرة
» الدال علي الخير كفاعله
langage c ++++ Emptyالأربعاء أبريل 17, 2024 6:19 pm من طرف ملاك الطيف

» صلى الله عليه وسلم
langage c ++++ Emptyالأربعاء أبريل 17, 2024 6:07 pm من طرف ملاك الطيف

» https://www.facebook.com/groups/1599246743680231
langage c ++++ Emptyالسبت ديسمبر 04, 2021 1:21 pm من طرف ملاك الطيف

» https://www.facebook.com/groups/1599246743680231
langage c ++++ Emptyالسبت ديسمبر 04, 2021 1:19 pm من طرف ملاك الطيف

» اللهم بلغنا يوم عرفة
langage c ++++ Emptyالإثنين يوليو 19, 2021 12:22 am من طرف ملاك الطيف

» قصة رائعة جدا
langage c ++++ Emptyالإثنين يوليو 19, 2021 12:14 am من طرف ملاك الطيف

» السلام عليكم ورحمة الله وبركاته
langage c ++++ Emptyالأحد يوليو 18, 2021 11:53 pm من طرف ملاك الطيف

» اللهم بلغنا رمضان
langage c ++++ Emptyالإثنين ديسمبر 28, 2020 2:12 pm من طرف ملاك الطيف

» سجل حضورك بالكلمة الطيبة لا اله الا الله
langage c ++++ Emptyالإثنين ديسمبر 28, 2020 2:11 pm من طرف ملاك الطيف

أفضل 10 أعضاء في هذا المنتدى
ملاك الطيف
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
رغد
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
روايات انسان
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
زهرة الياسمين
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
دموع الورد
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
المحب
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
البرنسيسه
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
دموع انسان
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
محمد15
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 
نسمة طيف
langage c ++++ I_vote_rcaplangage c ++++ I_voting_barlangage c ++++ I_vote_lcap 

 

 langage c ++++

اذهب الى الأسفل 
كاتب الموضوعرسالة
chahid
عضو مبدع
عضو  مبدع
chahid


عدد المساهمات : 78
تاريخ التسجيل : 24/02/2011

langage c ++++ Empty
مُساهمةموضوع: langage c ++++   langage c ++++ Emptyالإثنين نوفمبر 19, 2012 11:26 am

CHAPITRE 5

LES POINTEURS


L'étude des pointeurs montre l'adaptation du langage C à la conduite de processus. On verra dans ce chapitre et les suivants la puissance de cette notion par ailleurs de concept simple pour un informaticien industriel.


L'OPERATEUR ADRESSE &


L'opérateur adresse & retourne l'adresse d'une variable en mémoire.

Exemple: int i = 8;
printf("VOICI i: %d\n",i);
printf("VOICI SON ADRESSE EN HEXADECIMAL: %p\n",&i);

On remarque que le format d'une adresse est %p (hexadécimal) ou %d (décimal) dans printf.

Exercice V_1: Exécuter l’exemple précédent, et indiquer les cases-mémoire occupées par la variable i.

LES POINTEURS


Définition: Un pointeur est une adresse mémoire. On dit que le pointeur pointe sur cette adresse.


DECLARATION DES POINTEURS


Une variable de type pointeur se déclare à l'aide de l'objet pointé précédé du symbole * (opérateur d'indirection).

Exemple: char *pc; pc est un pointeur pointant sur un objet de type char
int *pi; pi est un pointeur pointant sur un objet de type int
float *pr; pr est un pointeur pointant sur un objet de type float

L'opérateur * désigne en fait le contenu de l'adresse.

Exemple: char *pc;
*pc = 34 ;
printf("CONTENU DE LA CASE MEMOIRE: %c\n",*pc);
printf("VALEUR DE L'ADRESSE EN HEXADECIMAL: %p\n",pc);

ARITHMETIQUE DES POINTEURS


On peut essentiellemet déplacer un pointeur dans un plan mémoire à l'aide des opérateurs d'addition, de soustraction, d'incrémentation, de décrémentation. On ne peut le déplacer que d'un nombre de cases mémoire multiple du nombre de cases réservées en mémoire pour la variable sur laquelle il pointe.





Exemples:


int *pi; /* pi pointe sur un objet de type entier */
float *pr; /* pr pointe sur un objet de type réel */
char *pc; /* pc pointe sur un objet de type caractère */

*pi = 421; /* 421 est le contenu de la case mémoire p et des 3 suivantes */
*(pi+1) = 53; /* on range 53 4 cases mémoire plus loin */
*(pi+2) = 0xabcd; /* on range 0xabcd 8 cases mémoire plus loin */
*pr = 45.7; /* 45,7 est rangé dans la case mémoire r et les 3 suivantes */
pr++; /* incrémente la valeur du pointeur r (de 4 cases mémoire) */
printf("L'ADRESSE r VAUT: %p\n",pr); /* affichage de la valeur de l'adresse r */

*pc = 'j'; /* le contenu de la case mémoire c est le code ASCII de 'j' */
pc--; /* décrémente la valeur du pointeur c (d'une case mémoire) */

ALLOCATION DYNAMIQUE


Lorsque l'on déclare une variable char, int, float .... un nombre de cases mémoire bien défini est réservé pour cette variable. Il n'en est pas de même avec les pointeurs.

Exemple:

char *pc;
*pc = 'a'; /* le code ASCII de a est rangé dans la case mémoire pointée par c */
*(pc+1) = 'b'; /* le code ASCII de b est rangé une case mémoire plus loin */
*(pc+2) = 'c'; /* le code ASCII de c est rangé une case mémoire plus loin */
*(pc+3) = 'd'; /* le code ASCII de d est rangé une case mémoire plus loin */


Dans cet exemple, le compilateur a attribué une valeur au pointeur c, les adresses suivantes sont donc bien définies; mais le compilateur n'a pas réservé ces places: il pourra très bien les attribuer un peu plus tard à d'autres variables. Le contenu des cases mémoires c c+1 c+2 c+3 sera donc perdu.
Ceci peut provoquer un blocage du système sous WINDOWS.

Il existe en langage C, des fonctions permettant d'allouer de la place en mémoire à un pointeur.
Il faut absolument les utiliser dès que l'on travaille avec les pointeurs.

Exemple: la fonction malloc

char *pc;
int *pi,*pj,*pk;
float *pr;
pc = (char*)malloc(10); /* on réserve 10 cases mémoire, soit la place pour 10 caractères */
pi = (int*)malloc(16); /* on réserve 16 cases mémoire, soit la place pour 4 entiers */
pr = (float*)malloc(24); /* on réserve 24 places en mémoire, soit la place pour 6 réels */
pj = (int*)malloc(sizeof(int)); /* on réserve la taille d'un entier en mémoire */
pk = (int*)malloc(3*sizeof(int)); /* on réserve la place en mémoire pour 3 entiers */

Libération de la mémoire: la fonction free

free(pi); /* on libère la place précédemment réservée pour i */
free(pr); /* on libère la place précédemment réservée pour r */

Exercice V_2:

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. Ecrire un programme qui affiche les valeurs de adr1, adr2 et de leur contenu.

AFFECTATION D'UNE VALEUR A UN POINTEUR

Dans les exemples précédents, l'utilisateur ne choisit pas la valeur des adresses mémoire attribuées par le compilateur à chaque variable. L'utilisateur se contente de lire la valeur de ces adresses en l' affichant sur l'écran.

On ne peut pas affecter directement une valeur à un pointeur:
l'écriture suivante est interdite: char *pc;
pc = 0xfffe;

On peut cependant être amené à définir par programmation la valeur d'une adresse. On utilise pour cela l'opérateur de "cast", jeu de deux parenthèses.
- Par exemple pour adresser un périphérique (adressage physique),
- Par exemple pour contrôler la zône DATA dans un plan mémoire.

Exemples:

char *pc;
pc = (char*)0x1000; /* p est l'adresse 0x1000 et pointe sur un caractère */

int *pi;
pi = (int*)0xfffa; /* i est l'adresse 0xfffa et pointe sur un entier */

Lorsqu'on utilise une fonction d'allocation dynamique on ne peut affecter de valeur au pointeur à l'aide de l'opérateur de cast.
Ces 2 premiers exemples sont à proscrire sous WINDOWS.

Exercice V_3:

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 V_4:

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 V_5:

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 V_6:

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


PETIT RETOUR A LA FONCTION SCANF


On a vu au chapitre 2 que pour saisir un caractère ou un nombre, on donne en fait l'adresse de ce caractère:

Exemple: char c;
printf("TAPER UNE LETTRE: ");
scanf("%c",&c);

On saisit ici le contenu de l'adresse &c c'est à dire le caractère c lui-même.

On peut donc aussi procéder ainsi:

char *adr;
printf("TAPER UNE LETTRE: ");
scanf("%c",adr);

On saisit ici le contenu de l'adresse adr.

Cette méthode s'applique aux caractères (char), aux entiers (int), aux réels (float).



CORRIGE DES EXERCICES


Exercice V_2:

#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 V_3:

#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 V_4:

#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 V_5:

#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 V_6:

#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(); }
[center]{
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
langage c ++++
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1
 مواضيع مماثلة
-
» langage c +++++
» langage c ++++
» langage c ++++
» langage c ++++
» langage c ++++

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
نسمة طيف :: قسم البرامج و التطوير :: دروس في الاعلاميات-
انتقل الى: