Bases de la programmation en C

void f(int x) { x = 10; }
void g(int *p) { *p = 20; }
int main(void) {
    int a = 1, b = 1;
    f(a);
    g(&b);
    printf("%d %d\n", a, b);
    return 0;
}

Quelle est la sortie obtenue en exécutant le programme ci-dessus ?

  1. A1 20
  2. B10 1
  3. C10 20
Afficher la réponse et l'explication

Réponse : A. 1 20

En C, les arguments des fonctions sont passés par valeur : l'appel f(a) copie la valeur 1 de a dans x. Mettre x à 10 dans f ne modifie que cette copie, et le a de l'appelant reste à 1. g(&b) passe l'adresse de b : *p = 20 dans g écrit donc dans b lui-même, et b passe à 20. Pour modifier une variable de l'appelant à l'intérieur d'une fonction appelée, on passe ainsi un pointeur.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. Lorsque la fonction f ci-dessus est appelée trois fois de suite, quelle est la valeur de retour du troisième appel ?
  2. En C, quelle association des durées de vie de (1) une variable locale déclarée sans static dans une fonction, (2) une zone allouée par malloc et (3) une variable déclarée hors de toute fonction est correcte ?
  3. int fait 32 bits (valeur maximale 2147483647). Quelle est la plus grande valeur de n pour laquelle la fonction fact(n) ci-dessus renvoie correctement la factorielle de n, sans dépassement de capacité ?
  4. int fait 4 octets et un pointeur 8 octets. Si la valeur (l'adresse) d'un pointeur sur int p est 0x1000, quelle est la valeur de p + 3 ?
  5. int fait 4 octets et un pointeur 8 octets. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?