Back
Close

Labo 10

profThiernesse
1,561 views
Next: Exercice 1

Introduction

Pour réaliser les exercices suivants il est utile d'avoir compris la théorie sur les pointeurs. Les pointeurs constituent une notion essentielle du langage C, mais néanmoins un peu complexe au début. Il faut prendre le temps de bien comprendre comment ils fonctionnent car beaucoup d'autres notions sont basées dessus.

Rappels :

  1. Chaque variable est stockée à une adresse précise en mémoire.
  2. Les pointeurs sont semblables aux variables, à ceci près qu'au lieu de stocker un nombre ils stockent l'adresse à laquelle se trouve une variable en mémoire.
  3. Si on place un symbole & devant un nom de variable, on obtient son adresse au lieu de sa valeur (ex. : &age).
  4. Si on place un symbole * devant un nom de pointeur, on obtient la valeur de la variable stockée à l'adresse indiquée par le pointeur.

Exemple 1

Essayer le code ci-dessous.

Note : %p permet d'afficher une adresse.

#include <stdio.h>
int main() {
int a = 55, b = 66, c = 77;
printf("L'adresse de a avant incrémentation : %p\n", &a);
printf("L'adresse de b avant incrémentation : %p\n", &b);
printf("L'adresse de c avant incrémentation : %p\n", &c);
a++;
b++;
c++;
printf("\nL'adresse de a après incrémentation : %p\n", &a);
printf("L'adresse de b après incrémentation : %p\n", &b);
printf("L'adresse de c après incrémentation : %p\n", &c);
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

On peut remarquer que l'adresse des variables a, b et c est la même avant et après la modification. L'adresse de la variable est bien indépendante de la valeur de la variable.

Que constatez-vous lors de l'exécution

Exemple 2

Avant de compléter le code, exécuter le une fois pour constater les valeurs de pta et ptb. Une fois compléter exécuter le code plusieurs fois.

#include <stdio.h>
int main() {
int a;
int b;
int *pta;
int *ptb;
//Partie à compléter pour que :
// - pta pointe vers a
// - ptb pointe vers b
printf("Adresse de a (direct) %p\n",&a);
printf("Adresse de a %p\n\n",pta);
printf("Adresse de b (direct) %p\n",&b);
printf("Adresse de b %p\n",ptb);
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Que constatez-vous lors des différentes exécutions

Exemple 3

#include <stdio.h>
int main()
{
int a = 55;
int *pa = &a;
printf("L'adresse de a est %p\n", &a);
printf("Le contenu de a est %d\n", a);
printf("Le contenu de pa est %p\n", pa);
printf("L'adresse de pa est %p\n", &pa);
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Que constatez-vous lors de l'exécution

Exemple 4

Cependant il faut être attentif au contexte dans lequel s'utilise une variable. Dans l'exemple qui suit, nous avons f() qui est appelé une fois depuis le main() et une autre depuis g(). Chaque appel de f() produit un contexte différent pour son paramètre p.

#include <stdio.h>
void f(int p) {
printf("L'adresse de p dans f() est %p\n", &p);
printf("Le contenu de p dans f() est %d\n",p);
}
void g(int a) {
printf("L'adresse de a dans g() est %p\n", &a);
printf("Le contenu de a dans g() est %d\n",a);
f(a);
}
int main() {
int a = 55;
printf("L'adresse de a dans main() est %p\n", &a);
printf("Le contenu de a dans main() est %d\n", a);
f(a);
g(a);
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Que constatez-vous lors de l'exécution

Quizz

Afin de tester votre compréhension de la matière, complèter ce questionnaire

Create your playground on Tech.io
This playground was created on Tech.io, our hands-on, knowledge-sharing platform for developers.
Go to tech.io
codingame x discord
Join the CodinGame community on Discord to chat about puzzle contributions, challenges, streams, blog articles - all that good stuff!
JOIN US ON DISCORD
Online Participants