Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Fonctions, Tableaux et Deux Pointeurs | Pointeurs
Bases Du C

bookFonctions, Tableaux et Deux Pointeurs

Fonctions avec pointeurs

Explorons une fonction de base pour modifier la valeur de nos données. Par exemple, imaginez qu'il vous faille une fonction qui convertit des kilo-ohms en ohms (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Une tentative de modification de la variable r a échoué. Cela s'explique par le fait que la fonction reçoit une copie de la variable r, et non la valeur réelle elle-même.

Pour que notre programme fonctionne comme prévu, il est nécessaire de transmettre l'adresse de la variable r à la fonction. Par conséquent, la fonction Ohm doit accepter un double* au lieu d'un simple double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Notez que la variable r est référencée deux fois. Après l'appel de la fonction Ohm, la valeur de r est modifiée. Cela s'explique par le fait que la fonction a reçu l'adresse originale de la variable r, et non une simple copie, puis a modifié la valeur à cette adresse précise.

De plus, une fonction peut retourner un pointeur vers un objet qu'elle a généré :

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Lorsqu'un nombre (pX + 1) est ajouté à une adresse, cela donne l'adresse de la cellule mémoire suivante ! Écrivons une boucle pour parcourir la « séquence » de la RAM :

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Vous avez anticipé trois étapes à l'avance. Il est évident, d'après les adresses obtenues, qu'il existe une hiérarchie claire.

Un tableau est essentiellement une adresse fixe (représentée par le nom du tableau) associée à une mémoire allouée. Les indices des éléments représentent leur décalage par rapport à l'adresse du premier élément !

Cette notion peut être vérifiée avec le programme suivant :

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Le parcours ne s'effectue pas directement à travers le tableau. Seule son adresse est utilisée, en particulier l'adresse de son premier élément.

question mark

Quelle affirmation explique le mieux pourquoi une fonction en C peut modifier la valeur d'une variable lorsqu'un pointeur vers celle-ci est passé, mais pas lorsque la variable elle-même est passée

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 6. Chapitre 5

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Awesome!

Completion rate improved to 2.63

bookFonctions, Tableaux et Deux Pointeurs

Glissez pour afficher le menu

Fonctions avec pointeurs

Explorons une fonction de base pour modifier la valeur de nos données. Par exemple, imaginez qu'il vous faille une fonction qui convertit des kilo-ohms en ohms (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Une tentative de modification de la variable r a échoué. Cela s'explique par le fait que la fonction reçoit une copie de la variable r, et non la valeur réelle elle-même.

Pour que notre programme fonctionne comme prévu, il est nécessaire de transmettre l'adresse de la variable r à la fonction. Par conséquent, la fonction Ohm doit accepter un double* au lieu d'un simple double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Notez que la variable r est référencée deux fois. Après l'appel de la fonction Ohm, la valeur de r est modifiée. Cela s'explique par le fait que la fonction a reçu l'adresse originale de la variable r, et non une simple copie, puis a modifié la valeur à cette adresse précise.

De plus, une fonction peut retourner un pointeur vers un objet qu'elle a généré :

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Lorsqu'un nombre (pX + 1) est ajouté à une adresse, cela donne l'adresse de la cellule mémoire suivante ! Écrivons une boucle pour parcourir la « séquence » de la RAM :

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Vous avez anticipé trois étapes à l'avance. Il est évident, d'après les adresses obtenues, qu'il existe une hiérarchie claire.

Un tableau est essentiellement une adresse fixe (représentée par le nom du tableau) associée à une mémoire allouée. Les indices des éléments représentent leur décalage par rapport à l'adresse du premier élément !

Cette notion peut être vérifiée avec le programme suivant :

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Le parcours ne s'effectue pas directement à travers le tableau. Seule son adresse est utilisée, en particulier l'adresse de son premier élément.

question mark

Quelle affirmation explique le mieux pourquoi une fonction en C peut modifier la valeur d'une variable lorsqu'un pointeur vers celle-ci est passé, mais pas lorsque la variable elle-même est passée

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 6. Chapitre 5
some-alt