Public cible
Débutants, étudiants et professionnels qui souhaitent acquérir une pratique structurée dans ce domaine.
Débutants, étudiants et professionnels qui souhaitent acquérir une pratique structurée dans ce domaine.
Aucune connaissance préalable n’est strictement obligatoire ; les prérequis détaillés sont précisés dans les ateliers.
Tous niveaux
En langage C, argc et argv sont des paramètres de la fonction main utilisés pour récupérer les arguments passés à un programme lors de son exécution. Ils permettent à un programme d'interagir avec la ligne de commande, ce qui est essentiel pour de nombreuses applications.
La signature de la fonction main utilisant argc et argv est :
int main(int argc, char *argv[])
{
// Code du programme
}
//utilisation de argc et argv pour lire et afficher les arguments de la ligne de commande
#include <stdio.h>
int main(int argc, char *argv[])
{
// Affiche le nombre d'arguments
printf("Nombre d'arguments : %d\n", argc);
// Affiche chaque argument
for (int i = 0; i < argc; i++) {
printf("Argument %d : %s\n", i, argv[i]);
}
return 0;
}
Si le programme ci-dessus est compilé (dans un fichier nommé arguments.c) et exécuté avec les arguments suivants :
gcc -o arguments arguments.c
./arguments Hello World
La sortie serait :
Nombre d'arguments : 3
Argument 0 : ./arguments
Argument 1 : Hello
Argument 2 : World
Analyse de la sortie
Nombre d'arguments : 3 :
L'utilisation de argc et argv en C est une méthode puissante pour passer des informations à un programme via la ligne de commande. Elle permet de rendre les programmes plus flexibles et interactifs. La compréhension de ces paramètres est essentielle pour tout développeur travaillant en C, car elle ouvre la porte à une large gamme d'applications, des utilitaires simples aux systèmes complexes de traitement de données.
La bibliothèque standard C est une bibliothèque standard qui contient un ensemble de fonctions et de macros prédéfinies qui facilitent la programmation en langage C.
Les trois en-têtes
<stdio.h> <stlib.h> <string.h> <stdio.h> - Entrée/Sortie StandardLa bibliothèque <stdio.h> est utilisée pour effectuer des opérations d'entrée/sortie standard en C, telles que la lecture et l'écriture dans la console et les fichiers.
Voici un exemple simple d'utilisation de <stdio.h>:
#include <stdio.h>
int main()
{
int nombre;
printf("Entrez un nombre : ");
scanf("%d", &nombre);
printf("Vous avez entré : %d\n", nombre);
return 0;
}
Dans cet exemple, nous utilisons printf pour afficher un message à l'utilisateur et scanf pour lire un entier à partir de l'entrée standard.
La bibliothèque <stdlib.h> fournit des fonctions pour la gestion de la mémoire dynamique, la génération de nombres aléatoires, et d'autres opérations courantes.
Exemple d'utilisation de <stdlib.h> pour générer un nombre aléatoire :
#include <stdio.h>
#include <string.h>
int main()
{
char chaine1[] = "Bonjour";
char chaine2[] = "Monde";
char chaine3[100]; // Tampon pour le résultat
// Copie de chaine1 dans chaine3
strcpy(chaine3, chaine1);
// Concaténation de chaine2 à la fin de chaine3
strcat(chaine3, chaine2);
printf("Résultat : %s\n", chaine3);
return 0;
}
La bibliothèque <string.h> est utilisée pour effectuer des opérations sur les chaînes de caractères en C. Voici un exemple d'utilisation de <string.h> pour copier et concaténer des chaînes de caractères :
#include <stdio.h>
#include <string.h>
int main()
{
char chaine1[] = "Bonjour";
char chaine2[] = "Monde";
char chaine3[100]; // Tampon pour le résultat
// Copie de chaine1 dans chaine3
strcpy(chaine3, chaine1);
// Concaténation de chaine2 à la fin de chaine3
strcat(chaine3, chaine2);
printf("Résultat : %s\n", chaine3);
return 0;
}
Les pointeurs en langage C sont des variables qui stockent l'adresse mémoire d'une autre variable. Ils offrent un moyen puissant de manipuler directement la mémoire, permettant un accès efficace et flexible aux données.
La déclaration d'un pointeur se fait en indiquant le type de données qu'il pointe, suivi d'une étoile (*). Exemple :
int *ptr; // Déclaration d'un pointeur vers un entier
Cela indique que ptr est un pointeur vers un entier. La variable pointée peut être n'importe quelle variable de type entier.
L'opérateur "address-of" (&) est utilisé pour obtenir l'adresse mémoire d'une variable. Par exemple :
int x = 10;
int *ptr = &x; // Pointeur ptr stocke l'adresse de x
L'opérateur de déréférencement (*) est utilisé pour accéder à la valeur pointée par un pointeur. Exemple :
int y = *ptr; // y prend la valeur stockée à l'adresse pointée par ptr
Les pointeurs sont souvent utilisés pour permettre à une fonction de modifier directement la valeur d'une variable en dehors de la fonction. Exemple :
void modifierValeur(int *ptr) {
*ptr = 42;
}
int main() {
int variable = 10;
modifierValeur(&variable); // Passer l'adresse de la variable à la fonction
// Maintenant, variable a la valeur 42
return 0;
}
En C, les tableaux peuvent être manipulés à l'aide de pointeurs. Par exemple :
int tableau[3] = {1, 2, 3};
int *ptr = tableau; // Pointeur pointant vers le début du tableau
// Accéder aux éléments du tableau via le pointeur
int premierElement = *ptr; // Équivalent à tableau[0]
int deuxiemeElement = *(ptr + 1); // Équivalent à tableau[1]
Les pointeurs en langage C offrent donc une puissance significative, mais ils nécessitent une gestion prudente de la mémoire. Ils sont indispensables pour des tâches avancées telles que la manipulation de structures de données complexes, l'allocation dynamique de mémoire et le passage efficace de paramètres entre fonctions. Comprendre les pointeurs est essentiel pour maîtriser le développement en langage C.
L'allocation dynamique de la mémoire est un concept fondamental en programmation. En langage C, cela permet de réserver de la mémoire à l'exécution, contrairement à l'allocation statique où la taille de la mémoire est déterminée à la compilation. L'allocation dynamique est particulièrement utile lorsque la taille de la mémoire nécessaire n'est connue qu'au moment de l'exécution du programme.
L'allocation dynamique en langage C peut être utilisée dans de nombreux scénarios pour gérer efficacement la mémoire à l'exécution.
En langage C, l'allocation dynamique est gérée par les fonctions suivantes, déclarées dans l'en-tête stdlib.h :
void* malloc(size_t size);void* calloc(size_t num_elements, size_t element_size);
void* realloc(void* ptr, size_t new_size);La syntaxe de malloc() est la suivante :
ptr = (cast_type*) malloc(size);
int* ptr;
ptr = (int*) malloc(10 * sizeof(int));
Cette instruction alloue de la mémoire pour 10 entiers et renvoie un pointeur vers le début de cette zone de mémoire.
La syntaxe de calloc() est la suivante :
ptr = (cast_type*) calloc(num_elements, element_size);
int* ptr;
ptr = (int*) calloc(10, sizeof(int));
# Cette instruction alloue de la mémoire pour 10 entiers et initialise tous les bits à zéro.
La syntaxe de realloc() est la suivante :
ptr = realloc(ptr, new_size);
ptr = realloc(ptr, 20 * sizeof(int));
# Cette instruction réalloue la mémoire pour le pointeur ptr avec une nouvelle taille de 20 entiers.
La fonction realloc est utilisée lorsque vous avez déjà alloué de la mémoire dynamiquement avec malloc, calloc, ou même si vous avez obtenu un pointeur par une précédente utilisation de realloc, et que vous souhaitez modifier la taille de ce bloc de mémoire.
int *ptr;
ptr = (int*)malloc(5 * sizeof(int)); // Alloue de la mémoire pour 5 entiers
// Utilisation de ptr...
ptr = (int*)realloc(ptr, 10 * sizeof(int)); // Agrandit le bloc de mémoire pour 10 entiers
Il est important de noter que realloc peut retourner un nouveau pointeur ou le même pointeur que celui passé en argument. Si la réallocation échoue, realloc renvoie NULL et l'ancien pointeur reste valide. Il est donc recommandé de stocker le résultat de realloc dans un nouveau pointeur pour éviter la perte de la référence à la mémoire allouée en cas d'échec de réallocation.
int *ptr;
ptr = (int*)malloc(10 * sizeof(int)); // Alloue de la mémoire pour 10 entiers
// Utilisation de ptr...
ptr = (int*)realloc(ptr, 5 * sizeof(int)); // Réduit le bloc de mémoire pour 5 entiers
Il est important de noter que realloc peut retourner un nouveau pointeur ou le même pointeur que celui passé en argument. Si la réallocation échoue, realloc renvoie NULL et l'ancien pointeur reste valide. Il est donc recommandé de stocker le résultat de realloc dans un nouveau pointeur pour éviter la perte de la référence à la mémoire allouée en cas d'échec de réallocation.
La syntaxe de free() est la suivante :
free(ptr); # Cette instruction libère la mémoire allouée pour le pointeur ptr.
Il est important de vérifier si les allocations de mémoire réussissent. Les fonctions malloc(), calloc() et realloc() retournent NULL si l'allocation échoue. Par conséquent, il est recommandé de vérifier si le pointeur retourné est NULL après chaque appel.
int* ptr;
ptr = (int*) malloc(10 * sizeof(int));
if (ptr == NULL)
{
printf("Erreur d'allocation de mémoire.\n");
exit(1);
}
Il est crucial de libérer la mémoire allouée dynamiquement à la fin de son utilisation pour éviter les fuites de mémoire. Utilisez la fonction free() pour libérer la mémoire lorsque vous n'en avez plus besoin.
free(ptr);
Le choix entre malloc et calloc dépend des besoins spécifiques de votre programme, en particulier de la nécessité d'initialiser ou non la mémoire allouée.
En résumé, si l'initialisation des données n'est pas nécessaire ou si elle sera effectuée manuellement après l'allocation, utilisez malloc. Si vous avez besoin que toutes les données allouées soient initialisées à zéro dès le départ, utilisez calloc.
#include <stdio.h>
#include <stdlib.h>
int main() {
// Déclaration d'un pointeur pour stocker l'adresse de la mémoire allouée
int *ptr;
int n;
// Demande à l'utilisateur de saisir la taille du tableau
printf("Entrez la taille du tableau : ");
scanf("%d", &n);
// Allocation dynamique de mémoire pour un tableau d'entiers de taille n
ptr = (int*)malloc(n * sizeof(int));
// Vérification si l'allocation a réussi
if (ptr == NULL) {
printf("Erreur d'allocation de mémoire.");
return 1; // Arrêt du programme avec un code d'erreur
}
// Demande à l'utilisateur de saisir les éléments du tableau
printf("Entrez les éléments du tableau :\n");
for (int i = 0; i < n; i++) {
scanf("%d", &ptr[i]);
}
// Affichage des éléments du tableau
printf("Les éléments du tableau sont :\n");
for (int i = 0; i < n; i++) {
printf("%d ", ptr[i]);
}
// Libération de la mémoire allouée
free(ptr);
return 0; // Fin normale du programme
}
Cet exemple permet à l'utilisateur de saisir la taille d'un tableau, puis les éléments de ce tableau. Il utilise l'allocation dynamique pour allouer de la mémoire en fonction de la taille saisie par l'utilisateur, stocke les éléments dans le tableau, les affiche, puis libère la mémoire allouée dynamiquement à la fin du programme.
L'allocation dynamique en langage C est une fonctionnalité puissante mais nécessite une gestion prudente de la mémoire. En comprenant les fonctions malloc(), calloc(), realloc() et free(), vous pouvez gérer efficacement la mémoire de votre programme de manière dynamique. Gardez à l'esprit de vérifier les erreurs d'allocation et de libérer la mémoire appropriée pour éviter les problèmes de fuite de mémoire.
le groupe de travail responsable du développement du langage de programmation C au sein de l'Organisation internationale de normalisation (ISO).
Ce site est une ressource précieuse pour tout ce qui concerne les normes et les spécifications du langage de programmation C. Vous y trouverez des informations sur les dernières normes C, des documents techniques, des projets en cours, des publications officielles et des liens vers d'autres ressources liées au langage C.
Si vous avez des questions spécifiques sur les normes C ou si vous recherchez des informations officielles sur le langage C, www.open-std.org est une source fiable pour cela
Publié le 09/05/2025