Fonctions, 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
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
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
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
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
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.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
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
Fonctions, 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
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
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
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
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
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.
Merci pour vos commentaires !