Pointers: &, *, and pass-by-pointer · Pointeurs : &, *, et passage par pointeur
A problem from last lesson
- Last lesson, a function got a copy of your number. Changing the copy did not change the original.
- C copies every argument you pass to a function. So a normal function cannot change your variable.
- To change it, the function needs the variable's address — where it lives in memory.
Un problème de la leçon précédente
- La leçon dernière, une fonction a reçu une copie de votre nombre. Modifier la copie n'a pas modifié l'original.
- Le C copie chaque argument que vous passez à une fonction. Ainsi, une fonction normale ne peut pas modifier votre variable.
- Pour la modifier, la fonction a besoin de l'adresse de la variable — là où elle se trouve en mémoire.
Every variable has an address
- Think of a variable as a box in memory. The value is kept inside the box.
- Every box has an address: a number that says where the box is.
- The
&operator gives you that address.&xmeans "the address ofx".
Chaque variable a une adresse
- Pensez à une variable comme une boîte en mémoire. La valeur est stockée à l'intérieur de cette boîte.
- Chaque boîte a une adresse : un nombre qui indique où se trouve la boîte.
- L'opérateur
&vous donne cette adresse.&xsignifie "l'adresse dex".
A pointer holds an address
- A pointer is a variable that stores an address, not a normal value.
- You declare one with a
*:int *p = &x;reads as "ppoints tox". - To reach the value at that address, put
*in front:*p. This is called dereference. - Changing
*pchanges the original variable.*p = 5;puts5intoxitself.
Un pointeur contient une adresse
- Un pointeur est une variable qui stocke une adresse, et non une valeur normale.
- Vous en declarez un avec un
*:int *p = &x;se lit "ppointe versx". - Pour accéder à la valeur à cette adresse, placez
*devant :*p. C'est ce qu'on appelle la déférence. - Modifier
*pmodifie la variable originale.*p = 5;met5directement dansx.
#include <stdio.h>
void set_to_five(int *p) {
*p = 5; // change the value at the address
}
int main(void) {
int x = 0;
set_to_five(&x); // pass the ADDRESS of x
printf("%d\n", x); // 5 — the original changed!
return 0;
}
Out-pointers: giving back more than one answer
- A function can
returnonly one value. But it can change several variables through pointers. - You pass the address of each answer, like
find(&min, &max). The function writes into them with*. - These extra pointer parameters are called out-pointers. The caller reads the answers after the call.
- A pointer that points to nothing is
NULL. Never dereference aNULLpointer.
Out-pointers : retourner plusieurs réponses
- Une fonction peut renvoyer une seule valeur via
return. Mais elle peut modifier plusieurs variables via des pointeurs. - Vous passez l'adresse de chaque réponse, comme
find(&min, &max). La fonction écrit dedans avec*. - Ces paramètres pointeur supplémentaires sont appelés out-pointers. L'appelant lit les réponses après l'appel.
- Un pointeur qui ne pointe sur rien est
NULL. Ne déréférez jamais un pointeurNULL.
Common mistakes
&xis the address ofx;*pis the value stored atp.- Never use
*pon an uninitialised orNULLpointer.
Erreurs courantes
&xest l'adresse dex;*pest la valeur stockée àp.- N'utilisez jamais
*psur un pointeur non initialisé ouNULL.
Now you try
- Each task gives you a function to complete. Use
*to read or change the value the pointer points to. - When a value comes in through a pointer (like
int *p), write your answer through it — do notreturnit. - Do not write a
main— the checker provides one. Press Run, then Check answer.
À vous maintenant
- Chaque exercice vous propose une fonction à compléter. Utilisez
*pour lire ou modifier la valeur à laquelle le pointeur pointe. - Lorsqu'une valeur entre par un pointeur (comme
int *p), écrivez votre réponse à travers lui — ne pas lereturn. - Ne writez pas de
main— le vérificateur en fournit un. Appuyez sur Run, puis Check answer.
Complete void add_one(int *p) so it adds 1 to the int that p points at. Use *p. Do not · non write a main — the checker provides one. · Complétez void add_one(int *p) pour qu'il ajoute 1 à l'entier auquel p pointe. Utilisez *p. Ne pas écrire de main — le vérificateur en fournit un.
Click Run to see the output here. · Cliquez sur Exécuter pour voir le résultat ici.
Complete void swap(int *a, int *b) so it exchanges the two ints. Use a temporary variable. Do not · non write a main. · Complétez void swap(int *a, int *b) pour qu'il échange les deux entiers. Utilisez une variable temporaire. Ne pas écrire de main.
Click Run to see the output here. · Cliquez sur Exécuter pour voir le résultat ici.
Complete void min_max(const int a[], int n, int *min_out, int *max_out). Scan the array, then write the smallest value through min_out and the largest through max_out. Assume n >= 1. Do not · non write a main. · Complétez void min_max(const int a[], int n, int *min_out, int *max_out). Parcourez le tableau, puis écrivez la plus petite valeur via min_out et la plus grande via max_out. Supposez n >= 1. Ne pas écrire de main.
Click Run to see the output here. · Cliquez sur Exécuter pour voir le résultat ici.