
Le langage de programmation C est incroyablement populaire et il est facile de comprendre pourquoi. La programmation en C est efficace et donne au programmeur beaucoup de contrôle. De nombreux autres langages de programmation tels que C++, Java et Python ont été développés à l'aide de C.
Les chances augmentent chaque jour que si vous êtes un programmeur, vous n'utiliserez pas C exclusivement pour votre travail. Cependant, il existe plusieurs apprentissages en C très bénéfiques, même si vous ne l'utilisez pas régulièrement. Voici pourquoi:
Vous serez capable de lire et d'écrire du code pour des logiciels pouvant être utilisés sur de nombreux types de plates-formes informatiques, y compris tout, des petits microcontrôleurs aux systèmes d'exploitation de bureau, portables et mobiles.
Vous comprendrez mieux ce que font les langages de haut niveau dans les coulisses, comme la gestion de la mémoire et le ramasse-miettes. Cette compréhension peut vous aider à écrire des programmes qui fonctionnent plus efficacement.
Si vous êtes un spécialiste des technologies de l'information (TI), vous pourriez également bénéficier de l'apprentissage du C. Les professionnels de l'informatique écrivent, maintiennent et exécutent souvent des scripts dans le cadre de leur travail. Un script est une liste d'instructions que le système d'exploitation d'un ordinateur doit suivre. Pour exécuter certains scripts, l'ordinateur met en place un environnement d'exécution contrôlé appelé shell . Étant donné que la plupart des systèmes d'exploitation exécutent des shells basés sur C, le shell C est une adaptation de script populaire de C utilisée par les professionnels de l'informatique.
Cet article couvre l'histoire de C, examine pourquoi C est si important, montre des exemples de code C de base et explore certaines fonctionnalités importantes de C, notamment les types de données, les opérations, les fonctions, les pointeurs et la gestion de la mémoire. Bien que cet article ne soit pas un manuel d'instructions pour la programmation en C, il couvre ce qui rend la programmation C unique d'une manière qui va au-delà des premiers chapitres du guide de programmation C moyen.
Commençons par examiner d'où vient le langage de programmation C, comment il s'est développé et quel est son rôle dans le développement de logiciels aujourd'hui.
- C'est quoi C?
- Édition et compilation du code C
- Le programme C le plus simple
- Concepts communs de programmation en C
- Fonctions en C
- Prototypes de fonction
- Types de données et opérations en C
- Ne partez pas de zéro, utilisez les bibliothèques
- Quelques pointeurs sur les pointeurs en C
- Utiliser correctement les pointeurs en C
- L'importance de la gestion de la mémoire en C
C'est quoi C?
La façon la plus simple de définir C est de l'appeler un langage de programmation informatique, ce qui signifie que vous pouvez écrire un logiciel avec lui qu'un ordinateur peut exécuter. Le résultat pourrait être une grande application informatique, comme votre navigateur Web, ou un petit ensemble d'instructions intégrées dans un microprocesseur ou un autre composant informatique.
Le langage C a été développé au début des années 1970 aux laboratoires Bell, principalement grâce aux travaux de Ken Thompson et Dennis Ritchie. Les programmeurs avaient besoin d'un ensemble d'instructions plus convivial pour le système d'exploitation UNIX, qui à l'époque nécessitait des programmes écrits en langage d'assemblage. Les programmes d'assemblage, qui parlent directement au matériel d'un ordinateur, sont longs et difficiles à déboguer, et ils ont nécessité un travail fastidieux et chronophage pour ajouter de nouvelles fonctionnalités [source : King].
La première tentative de Thompson pour un langage de haut niveau s'appelait B, un hommage au langage de programmation système BCPL sur lequel il était basé. Lorsque Bell Labs a acquis un modèle de système UNIX Digital Equipment Corporation (DEC) PDP-11, Thompson a retravaillé B pour mieux répondre aux exigences du matériel système plus récent et meilleur. Ainsi, le successeur de B, C, est né. En 1973, C était suffisamment stable pour qu'UNIX lui-même puisse être réécrit à l'aide de ce nouveau langage innovant de niveau supérieur [source : King].
Avant que C puisse être utilisé efficacement au-delà des Bell Labs, d'autres programmeurs avaient besoin d'un document expliquant comment l'utiliser. En 1978, le livre "The C Programming Language" de Brian Kernighan et Dennis Ritchie, connu par les passionnés de C sous le nom de K&R ou le "White Book", est devenu la source définitive de la programmation en C. Au moment d'écrire ces lignes, la deuxième édition de K&R, initialement publiée en 1988, est encore largement disponible. La version originale et pré-standard de C s'appelle K&R C basée sur ce livre.
Pour s'assurer que les gens ne créent pas leurs propres dialectes au fil du temps, les développeurs C ont travaillé dans les années 1980 pour créer des normes pour le langage. La norme américaine pour C, la norme X3.159-1989 de l'American National Standards Institute (ANSI), est devenue officielle en 1989. La norme de l'Organisation internationale de normalisation (ISO), ISO/IEC 9899:1990, a suivi en 1990. Les versions de C après K&R référence ces normes et leurs révisions ultérieures (C89, C90 et C99). Vous pouvez également voir C89 appelé "ANSI C", "ANSI/ISO C" ou "ISO C".
C et son utilisation dans UNIX n'étaient qu'une partie du boom du développement du système d'exploitation dans les années 1980. Malgré toutes ses améliorations par rapport à ses prédécesseurs, cependant, C n'était toujours pas facile à utiliser pour développer des applications logicielles plus volumineuses. À mesure que les ordinateurs devenaient plus puissants, la demande augmentait pour une expérience de programmation plus facile. Cette demande a incité les programmeurs à créer leurs propres compilateurs, et donc leurs propres nouveaux langages de programmation, en utilisant C. Ces nouveaux langages pourraient simplifier le codage de tâches complexes avec de nombreuses pièces mobiles. Par exemple, des langages comme C++ et Java, tous deux développés à partir de C, simplifient la programmation orientée objet, une approche de programmation qui optimise la capacité d'un programmeur à réutiliser le code.
Maintenant que vous connaissez un peu le contexte, regardons les mécanismes du C lui-même.
Édition et compilation du code C
C est ce qu'on appelle un langage compilé, ce qui signifie que vous devez utiliser un compilateur pour transformer le code en un fichier exécutable avant de pouvoir l'exécuter. Le code est écrit dans un ou plusieurs fichiers texte, que vous pouvez ouvrir, lire et modifier dans n'importe quel éditeur de texte, tel que le Bloc-notes sous Windows, TextEdit sur Mac et gedit sous Linux. Un fichier exécutable est quelque chose que l'ordinateur peut exécuter (exécuter). Le compilateur vérifie le code pour les erreurs et, s'il semble être sans erreur, crée un fichier exécutable.
Avant de regarder ce qui se passe dans le code C, assurons-nous que nous pouvons trouver et utiliser un compilateur C. Si vous utilisez Mac OS X et la plupart des distributions Linux (comme Ubuntu), vous pouvez ajouter un compilateur C à votre ordinateur si vous installez le logiciel d'outils de développement pour ce système d'exploitation particulier. Ces compilateurs C gratuits sont des outils de ligne de commande, ce qui signifie que vous les exécuterez généralement à partir d'une invite de commande dans une fenêtre de terminal. La commande pour exécuter l'un de ces compilateurs C est "cc" ou "gcc" plus quelques options et arguments de ligne de commande, qui sont d'autres mots tapés après la commande avant d'appuyer sur Entrée.
Si vous utilisez Microsoft Windows ou si vous préférez utiliser une interface utilisateur graphique plutôt qu'une ligne de commande, vous pouvez installer un environnement de développement intégré (IDE) pour la programmation en C. Un IDE est une interface unique où vous pouvez écrire votre code, le compiler, le tester et trouver et corriger rapidement les erreurs. Pour Windows, vous pouvez acheter le logiciel Microsoft Visual C++, un IDE pour la programmation C et C++. Un autre IDE populaire est Eclipse, un IDE gratuit basé sur Java qui s'exécute sur Windows, Mac et Linux et dispose d'extensions disponibles pour compiler C et de nombreux autres langages de programmation.
Pour C, comme pour les autres langages de programmation informatique, la version du compilateur que vous utilisez est très importante. Vous souhaitez toujours utiliser une version du compilateur C qui est aussi nouvelle ou plus récente que la version du langage C que vous utilisez dans votre programme. Si vous utilisez un IDE, assurez-vous d'ajuster vos paramètres pour vous assurer que l'IDE utilise votre version C cible pour le programme sur lequel vous travaillez. Si vous êtes sur une ligne de commande, vous pouvez ajouter un argument de ligne de commande pour changer la version comme dans la commande suivante :
gcc –std c99 –o monprogramme.exe monprogramme.c
Dans la commande ci-dessus, "gcc" est l'appel pour exécuter le compilateur et tout le reste est une option ou un argument de ligne de commande. L'option "-std" a été ajoutée suivie de "c99" pour indiquer au compilateur d'utiliser la version standard C99 de C lors de sa compilation. L'option "-o" a été ajoutée suivie de "myprogram.exe" pour demander que l'exécutable, le fichier de sortie du compilateur, soit nommé myprogram.exe. Sans "-o", l'exécutable est automatiquement nommé a.out à la place. Le dernier argument "myprogram.c" indique le fichier texte avec le code C à compiler. En bref, cette commande dit : "Hé, gcc, compilez myprogram.c en utilisant la norme de programmation C99 C et placez les résultats dans un fichier nommé myprogram.exe."
Une fois votre compilateur installé, vous êtes prêt à programmer en C. Commençons par examiner la structure de base de l'un des programmes C les plus simples que vous puissiez écrire.
Le programme C le plus simple
Regardons un programme C simple et utilisons-le à la fois pour comprendre les bases du C et le processus de compilation C. Si vous avez votre propre ordinateur avec un compilateur C installé comme décrit précédemment, vous pouvez créer un fichier texte nommé sample.c et l'utiliser pour suivre pendant que nous parcourons cet exemple. Notez que si vous omettez le .c dans le nom du fichier, ou si votre éditeur ajoute .txt au nom, vous obtiendrez probablement une sorte d'erreur lors de la compilation.
Voici notre exemple de programme :
/* Exemple de programme */
#inclure
int main()
{
printf("Ceci est la sortie de mon premier programme !\n");
renvoie 0 ;
}
Une fois compilé et exécuté, ce programme demande à l'ordinateur d'imprimer la ligne "Ceci est la sortie de mon premier programme!" puis arrêtez. Vous ne pouvez pas faire beaucoup plus simple que cela ! Voyons maintenant ce que fait chaque ligne :
Ligne 1 -- C'est une façon d'écrire des commentaires en C, entre /* et */ sur une ou plusieurs lignes.
Ligne 2 -- La commande #include indique au compilateur de rechercher d'autres sources pour le code C existant, en particulier les bibliothèques, qui sont des fichiers contenant des instructions réutilisables communes. Le fait référence à une bibliothèque C standard avec des fonctions pour obtenir l'entrée d'un utilisateur et pour écrire la sortie à l'écran. Nous examinerons les bibliothèques de plus près plus tard.
Ligne 3 -- Cette ligne est la première ligne d'une définition de fonction. Chaque programme C a au moins une fonction, ou un bloc de code représentant quelque chose que l'ordinateur doit faire lorsque le programme s'exécute. La fonction exécute sa tâche, puis produit un sous-produit, appelé valeur de retour, qui peut être utilisé par d'autres fonctions. Au minimum, le programme a une fonction appelée main comme celle montrée ici avec une valeur de retour avec le type de données int, ce qui signifie entier. Lorsque nous examinerons les fonctions plus tard, vous verrez ce que signifient les parenthèses vides.
Lignes 4 et 7 -- Les instructions d'une fonction sont entre accolades. Certains programmeurs commencent et terminent un bloc entre accolades sur des lignes séparées, comme illustré ici. D'autres mettront l'accolade ouverte ({) à la fin de la première ligne de la définition de la fonction. Bien que les lignes de code du programme n'aient pas à être tapées sur des lignes séparées, les programmeurs placent généralement chaque instruction sur une ligne séparée, indentée avec des espaces, pour rendre le code plus facile à lire et à modifier ultérieurement.
Ligne 5 -- Il s'agit d'un appel de fonction à une fonction nommée printf. Cette fonction est codée dans la bibliothèque stdio.h incluse à partir de la ligne 1, vous n'avez donc pas à l'écrire vous-même. Cet appel à printf lui indique ce qu'il faut imprimer à l'écran. Le \n à la fin, entre guillemets, n'est cependant pas imprimé ; c'est une séquence d'échappement qui demande à printf de déplacer le curseur sur la ligne suivante à l'écran. De plus, comme vous pouvez le voir, chaque ligne de la fonction doit se terminer par un point-virgule.
Ligne 6 -- Chaque fonction qui renvoie une valeur doit inclure une instruction de retour comme celle-ci. En C, la fonction principale doit toujours avoir un type de retour entier, même si elle n'est pas utilisée dans le programme. Notez que lorsque vous exécutez un programme C, vous exécutez essentiellement sa fonction principale. Ainsi, lorsque vous testez le programme, vous pouvez dire à l'ordinateur d'afficher la valeur de retour de l'exécution du programme. Une valeur de retour de 0 est préférable car les programmeurs recherchent généralement cette valeur dans les tests pour confirmer que le programme a été exécuté avec succès.
Lorsque vous êtes prêt à tester votre programme, enregistrez le fichier, compilez et exécutez le programme. Si vous utilisez le compilateur gcc en ligne de commande et que le programme se trouve dans un fichier appelé sample.c, vous pouvez le compiler avec la commande suivante :
gcc -o exemple.exe exemple.c
S'il n'y a pas d'erreurs dans le code, vous devriez avoir un fichier nommé sample.exe dans le même répertoire que sample.c après avoir exécuté cette commande. L'erreur la plus courante est une erreur de syntaxe, ce qui signifie que vous avez fait une erreur de frappe, comme laisser un point-virgule à la fin d'une ligne ou ne pas fermer les guillemets ou les parenthèses. Si vous devez apporter des modifications, ouvrez le fichier dans votre éditeur de texte, corrigez-le, enregistrez vos modifications et essayez à nouveau votre commande de compilation.
Pour exécuter le programme sample.exe, entrez la commande suivante. Notez le ./ qui force l'ordinateur à regarder dans le répertoire courant pour trouver le fichier exécutable :
./sample.exe
Ce sont les bases du codage et de la compilation pour C, bien que vous puissiez en apprendre beaucoup plus sur la compilation à partir d'autres ressources de programmation C. Maintenant, ouvrons la boîte et voyons quelles pièces C a pour construire des programmes.
Concepts communs de programmation en C
Voyons comment mettre en pratique certains des concepts de programmation courants dans votre code C. Voici un bref résumé de ces concepts :
Fonctions -- Comme indiqué précédemment, une fonction est un bloc de code représentant quelque chose que l'ordinateur doit faire lorsque le programme s'exécute. Certains langages appellent ces structures des méthodes, bien que les programmeurs C n'utilisent généralement pas ce terme. Votre programme peut définir plusieurs fonctions et appeler ces fonctions à partir d'autres fonctions. Plus tard, nous examinerons de plus près la structure des fonctions en C.
Variables -- When you run a program, sometimes you need the flexibility to run the program without knowing what the values are ahead of time. Like other programming languages, C allows you to use variables when you need that flexibility. Like variables in algebra, a variable in computer programming is a placeholder that stands for some value that you don't know or haven't found yet.
Data types -- In order to store data in memory while your program is running, and to know what operations you can perform on that data, a programming language like C defines certain data types it will recognize. Each data type in C has a certain size, measured in binary bits or bytes, and a certain set of rules about what its bits represent. Coming up, we'll see how important it is choose the right data type for the task when you're using C.
Operations -- In C, you can perform arithmetic operations (such as addition) on numbers and string operations (such as concatenation) on strings of characters. C also has built-in operations specifically designed for things you might want to do with your data. When we check out data types in C, we'll take a brief look at the operations, too.
Loops -- One of the most basic things a programmer will want to do is repeat an action some number of times based on certain conditions that come up while the program is running. A block of code designed to repeat based on given conditions is called a loop, and the C language provides for these common loop structures: while, do/while, for, continue/break and goto. C also includes the common if/then/else conditionals and switch/case statements.
Data structures -- When your program has a lot of data to handle, and you need to sort or search through that data, you'll probably use some sort of data structure. A data structure is a structured way of representing several pieces of data of the same data type. The most common data structure is an array, which is just an indexed list of a given size. C has libraries available to handle some common data structures, though you can always write functions and set up your own structures, too.
Preprocessor operations -- Sometimes you'll want to give the compiler some instructions on things to do with your code before compiling it into the executable. These operations include substituting constant values and including code from C libraries (which you saw in the sample code earlier).
C also requires programmers to handle some concepts which many programming languages have simplified or automated. These include pointers, memory management, and garbage collection. Later pages cover the important things to know about these concepts when programming in C.
This quick overview of concepts may seem overwhelming if you're not already a programmer. Before you move on to tackle a dense C programming guide, let's take a user-friendly look at the core concepts among those listed above, starting with functions.
Functions in C
Most computer programming languages allow you to create functions of some sort. Functions let you chop up a long program into named sections so that you can reuse those sections throughout the program. Programmers for some languages, especially those using object-oriented programming techniques, use the term method instead of function.
Functions accept parameters and return a result. The block of code that comprises a function is its function definition. The following is the basic structure of a function definition:
{
return
}
Au minimum, un programme C a une fonction nommée main. Le compilateur recherchera une fonction main comme point de départ du programme, même si la fonction main appelle d'autres fonctions en son sein. Ce qui suit est le principal que nous avons vu dans le programme C simple que nous avons examiné précédemment. Il a un type de retour entier, ne prend aucun paramètre et a deux instructions (instructions dans la fonction), dont l'une est son instruction de retour :
int main()
{
printf("Ceci est la sortie de mon premier programme !\n");
renvoie 0 ;
}
Les fonctions autres que main ont une définition et un ou plusieurs appels de fonction. Un appel de fonction est une instruction ou une partie d'instruction dans une autre fonction. L'appel de fonction nomme la fonction qu'il appelle suivi de parenthèses. Si la fonction a des paramètres, l'appel de fonction doit inclure les valeurs correspondantes pour correspondre à ces paramètres. Cette partie supplémentaire de l'appel de fonction s'appelle passer des paramètres à la fonction.
Mais que sont les paramètres ? Un paramètre pour une fonction est un élément de données d'un certain type de données dont la fonction a besoin pour faire son travail. Les fonctions en C peuvent accepter un nombre illimité de paramètres, parfois appelés arguments. Chaque paramètre ajouté à une définition de fonction doit spécifier deux choses : son type de données et son nom de variable dans le bloc fonction. Plusieurs paramètres doivent être séparés par une virgule. Dans la fonction suivante, il y a deux paramètres, tous deux entiers :
int doubleEtAjoute(int a, int b)
{
retour ((2*a)+(2*b));
}
Ensuite, poursuivons notre examen des fonctions en effectuant un zoom arrière pour voir comment elles s'intègrent dans un programme C plus large.
Prototypes de fonction
En C, vous pouvez ajouter une définition de fonction n'importe où dans le programme (sauf dans une autre fonction). La seule condition est que vous devez indiquer au compilateur à l'avance que la fonction existe quelque part plus tard dans le code. Vous ferez cela avec un prototype de fonction au début du programme. Le prototype est une déclaration qui ressemble à la première ligne de la définition. En C, vous n'avez pas à donner les noms des paramètres dans le prototype, seulement les types de données. Voici à quoi ressemblerait le prototype de la fonction pour la fonction doubleAndAdd :
int doubleAndAdd(int, int);
Imaginez des prototypes de fonction comme liste de colisage pour votre programme. Le compilateur décompressera et assemblera votre programme comme vous pourriez décompresser et assembler une nouvelle bibliothèque. La liste de colisage vous aide à vous assurer que vous avez toutes les pièces dont vous avez besoin dans la boîte avant de commencer à assembler la bibliothèque. Le compilateur utilise les prototypes de fonction de la même manière avant de commencer à assembler votre programme.
Si vous suivez le programme sample.c que nous avons vu précédemment, ouvrez et modifiez le fichier pour ajouter un prototype de fonction, une définition de fonction et un appel de fonction pour la fonction doubleAndAdd illustrée ici. Ensuite, compilez et exécutez votre programme comme avant pour voir comment le nouveau code fonctionne. Vous pouvez utiliser le code suivant comme guide pour l'essayer :
#inclure
int doubleAndAdd(int, int);
int main()
{
printf("Ceci est la sortie de mon premier programme !\n");
printf("If you double then add 2 and 3, the result is: %d \n", doubleAndAdd(2,3));
return 0;
}
int doubleAndAdd(int a, int b)
{
return ((2*a)+(2*b));
}
So far we've looked at some basic structural elements in a C program. Now, let's look at the types of data you can work with in a C program and what operations you can perform on that data.
Function Declarations
In C, you'll probably hear the term function declaration more than function prototype, especially among older C programmers. We're using the term function prototype in this article, though, because it has an important distinction. Originally, a function declaration did not require any parameters, so the return type, function name and a pair of empty parentheses were sufficient. A function prototype, though, gives the compiler important additional information by including the number and data types of the parameters it will call. Prototypes have become a best practice approach among coders today, in C and other programming languages.
Data Types and Operations in C

From your computer's perspective, data is nothing but a series of ones and zeros representing on and off states for the electronic bits on your hard drive or in your computer's processor or memory. It's the software you're running on a computer that determines how to make sense of those billions of binary digits. C is one of few high-level languages that can easily manipulate data at the bit level in addition to interpreting the data based on a given data type.
A data type is a small set of rules that indicate how to make sense of a series of bits. The data type has a specific size plus its own way of performing operations (such as adding and multiplying) on data of that type. In C, the size of the data type is related to the processor you're using. For example, in C99, a piece of data of the integer data type (int) is 16 bits long in a 16-bit processor while for 32-bit and 64-bit processors it's 32 bits long.
Another important thing for C programmers to know is how the language handles signed and unsigned data types. A signed type means that one of its bits is reserved as the indicator for whether it's a positive or negative number. So, while an unsigned int on a 16-bit system can handle numbers between 0 and 65,535, a signed in on the same system can handle numbers between -32,768 and 32,767. If an operation causes an int variable to go beyond its range, the programmer has to handle the overflow with additional code.
Given these constraints and system-specific peculiarities in C data types and operations, C programmers must choose their data types based on the needs of their programs. Some of the data types they can choose are the primitive data types in C, meaning those built in to the C programming language. Look to your favorite C programming guide for a complete list of the data types in C and important information about how to convert data from one type to another.
C programmers can also create data structures, which combine primitive data types and a set of functions that define how the data can be organized and manipulated. Though the use of data structures is an advanced programming topic and beyond the scope of this article, we will take a look at one of the most common structures: arrays. An array is a virtual list containing pieces of data that are all the same data type. An array's size can't be changed, though its contents can be copied to other larger or smaller arrays.
Though programmers often use arrays of numbers, character arrays, called strings, have the most unique features. A string allows you to save something you might say (like "hello") into a series of characters, which your C program can read in from the user or print out on the screen. String manipulation has such a unique set of operations, it has its own dedicated C library (string.h) with your typical string functions.
The built-in operations in C are the typical operations you'd find in most programming languages. When you're combining several operations into a single statement, be sure to know the operator precedence, or the order in which the program will perform each operation in a mathematical expression. For example, (2+5)*3 equals 21 while 2+5*3 equals 17, because C will perform multiplication before addition unless there are parentheses indicating otherwise.
If you're learning C, make it a priority to familiarize yourself with all of its primitive data types and operations and the precedence for operations in the same expression. Also, experiment with different operations on variables and numbers of different data types.
At this point, you've scratched the surface of some important C basics. Next, though, let's look at how C enables you to write programs without starting from scratch every time.
Don't Start from Scratch, Use Libraries
Libraries are very important in C because the C language supports only the most basic features that it needs. For example, C doesn't contain input-output (I/O) functions to read from the keyboard and write to the screen. Anything that extends beyond the basics must be written by a programmer. If the chunk of code is useful to multiple different programs, it's often put into a library to make it easily reusable.
In our discussion of C so far, we've already seen one library, the standard I/O (stdio) library. The #include line at the beginning of the program instructed the C compiler to loaded the library from its header file named stdio.h. C maintainers include standard C libraries for I/O, mathematical functions, time manipulation and common operations on certain data structures, such as a string of characters. Search the Web or your favorite C programming guide for information about the C89 standard library and the updates and additions in C99.
You, too, can write C libraries. By doing so, you can split your program into reusable modules. This modular approach not only makes it easy to include the same code in multiple programs, but it also makes for shorter program files which are easier to read, test and debug.
To use the functions within a header file, add a #include line for it at the beginning of your program. For standard libraries, put the name of the library's corresponding header file between greater-than and less-than signs (). For libraries you create yourself, put the name of the file between double quotes. Unlike statements in other parts of your C program, you don't have to put a semicolon at the end of each line. The following shows including one of each type of library:
#include
#include "mylib.h"
A comprehensive C programming source should provide the instructions you need to write your own libraries in C. The function definitions you'll write are not any different whether they're in a library or in your main program. The difference is that you'll compile them separately in something called an object file (with a name ending in .o), and you'll create a second file, called a header file (with a name ending in .h) which contains the function prototypes corresponding to each function in the library. It's the header file you'll reference in your #include line in each main program that uses your library, and you'll include the object file as an argument in the compiler command each time you compile that program.
The C features we've explored so far are typical in other programming languages, too. Next, though, we'll talk about how C manages your computer's memory.
Some Pointers about Pointers in C
When your C program is loaded into memory (typically the random-access memory, or RAM, in your computer), each piece of the program is associated with an address in memory. This includes the variables you're using to hold certain data. Each time your program calls a function, it loads that function and all of its associated data into memory just long enough to run that function and return a value. If you pass parameters to the function, C automatically makes a copy of the value to use in the function.
Sometimes when you run a function, though, you want to make some permanent change to the data at its original memory location. If C makes a copy of data to use in the function, the original data remains unchanged. If you want to change that original data, you have to pass a pointer to its memory address (pass by reference) instead of passing its value to the function (pass by value).
Pointers are used everywhere in C, so if you want to use the C language fully you have to have a good understanding of pointers. A pointer is a variable like other variables, but its purpose is to store the memory address of some other data. The pointer also has a data type so it knows how to recognize the bits at that memory address.
When you look at two variables side-by-side in C code, you may not always recognize the pointer. This can be a challenge for even the most experienced C programmers. When you first create a pointer, though, it's more obvious because there must be an asterisk immediately before the variable name. This is known as the indirection operator in C. The following example code creates an integer i and a pointer to an integer p:
int i;
int *p;
Currently there is no value assigned to either i or p. Next, let's assign a value to i and then assign p to point to the address of i.
i = 3;
p = &i;
Here you can see the ampersand (&) used as the address operator immediately before i, meaning the "address of i." You don't have to know what that address is to make the assignment. That's good, because it will likely be different every time you run the program! Instead, the address operator will determine the address associated with that variable while the program is running. Without the address operator, the assignment p=i would assign p the memory address of 3, literally, rather than the memory address of the variable i.
Next, let's look at how you can use pointers in C code and the challenges you'll want to be prepared for.
Using Pointers Correctly in C

Once you have a pointer, you can use that in place of a variable of the same data type in operations and function calls. In the following example, the pointer to i is used instead of i within a larger operation. The asterisk used with the p (*p) indicates that the operation should use the value that p is pointing to at that memory address, not the memory address itself:
int b;
b = *p + 2;
Without pointers, it's nearly impossible to divide tasks into functions outside of main in your C program. To illustrate this, consider you've created a variable in main called h that stores the user's height to the nearest centimeter. You also call a function you've written named setHeight that prompts the user to set that height value. The lines in your main function might look something like this:
int h;
setHeight(h); /* There is a potential problem here. */
This function call will try to pass the value of h to setHeight. However, when the function finishes running, the value of h will be unchanged because the function only used a copy of it and then discarded it when it finished running.
If you want to change h itself, you should first ensure that the function can take a pointer to an existing value rather than a new copy of a value. The first line of setHeight, then, would use a pointer instead of a value as its parameter (note the indirection operator):
setHeight(int *height) { /* Function statements go here */ }
Then, you have two choices for calling setHeight. The first is to use the address operator for h as the passed parameter (&h). The other is to create a separate pointer to h and pass that instead. The following shows both options:
setHeight(&h); /* Passe l'adresse de h à la fonction */
entier *p ;
p = &h;
setHeight(p); /* Passe un pointeur séparé vers l'adresse de h à la fonction */
La deuxième option révèle un défi commun lors de l'utilisation de pointeurs. Le défi consiste à avoir plusieurs pointeurs vers la même valeur. Cela signifie que tout changement dans cette valeur affecte tous ses pointeurs à la fois. Cela peut être une bonne ou une mauvaise chose, selon ce que vous essayez d'accomplir dans votre programme. Encore une fois, maîtriser l'utilisation des pointeurs est une clé importante pour maîtriser la programmation en C. Entraînez-vous autant que possible avec des pointeurs afin d'être prêt à relever ces défis.
Les fonctionnalités C que nous avons explorées jusqu'à présent sont également typiques d'autres langages de programmation. Ensuite, cependant, nous examinerons les exigences de C en matière de gestion soigneuse de la mémoire.
L'importance de la gestion de la mémoire en C
L'une des choses qui font du C un langage si polyvalent est que le programmeur peut réduire un programme pour qu'il s'exécute avec une très petite quantité de mémoire. Lorsque C a été écrit pour la première fois, c'était une fonctionnalité importante car les ordinateurs n'étaient pas aussi puissants qu'ils le sont aujourd'hui. Avec la demande actuelle de petits appareils électroniques, des téléphones portables aux petits appareils médicaux, il y a un intérêt renouvelé à maintenir les besoins en mémoire à un faible niveau pour certains logiciels. C est le langage de prédilection de la plupart des programmeurs qui ont besoin de beaucoup de contrôle sur l'utilisation de la mémoire.
Pour mieux comprendre l'importance de la gestion de la mémoire, réfléchissez à la manière dont un programme utilise la mémoire. Lorsque vous exécutez un programme pour la première fois, il se charge dans la mémoire de votre ordinateur et commence à s'exécuter en envoyant et en recevant des instructions du processeur de l'ordinateur. Lorsque le programme doit exécuter une fonction particulière, il charge cette fonction dans une autre partie de la mémoire pendant la durée de son exécution, puis abandonne cette mémoire lorsque la fonction est terminée. De plus, chaque nouvelle donnée utilisée dans le programme principal occupe de la mémoire pendant toute la durée du programme.
Si vous voulez plus de contrôle sur tout cela, vous avez besoin d'une allocation de stockage dynamique. C prend en charge l'allocation de stockage dynamique, qui est la possibilité de réserver de la mémoire selon vos besoins et de la libérer dès que vous avez fini de l'utiliser. De nombreux langages de programmation ont une allocation de mémoire automatique et une récupération de place qui gèrent ces tâches de gestion de la mémoire. C, cependant, vous permet (et dans certains cas exige) d'être explicite sur l'allocation de mémoire avec les fonctions clés suivantes de la bibliothèque C standard :
- malloc - Abréviation d'allocation de mémoire, malloc est utilisé pour réserver un bloc de mémoire d'une taille donnée pour stocker un certain type de données que votre programme doit traiter. Lorsque vous utilisez malloc, vous créez un pointeur vers la mémoire allouée. Ce n'est pas nécessaire pour une seule donnée, comme un entier, qui est allouée dès que vous la déclarez pour la première fois (comme dans int i). Cependant, il s'agit d'une partie importante de la création et de la gestion de structures de données telles que des tableaux. Les autres options d'allocation de mémoire en C sont calloc , qui efface également la mémoire lorsqu'elle est réservée, et realloc , qui redimensionne la mémoire précédemment réservée.
- free -- Utilisez free pour forcer votre programme à libérer la mémoire précédemment assignée à un pointeur donné.
La meilleure pratique lors de l'utilisation de malloc et de free est que tout ce que vous allouez doit être libéré. Chaque fois que vous allouez quelque chose, même dans une fonction temporaire, il reste en mémoire jusqu'à ce que le système d'exploitation libère l'espace. Cependant, pour vous assurer que la mémoire est libre et prête à être utilisée immédiatement, vous devez la libérer avant que la fonction en cours ne se termine. Cette gestion de la mémoire signifie que vous pouvez réduire au minimum l'empreinte mémoire de votre programme et éviter les fuites de mémoire. Une fuite de mémoire est un défaut de programme dans lequel il continue d'utiliser de plus en plus de mémoire jusqu'à ce qu'il n'en reste plus à allouer, provoquant le blocage ou le blocage du programme. D'un autre côté, ne soyez pas si anxieux de libérer de la mémoire au point de libérer, et donc de perdre, quelque chose dont vous aurez besoin plus tard dans la même fonction.
Tout au long de cet article, vous avez appris certaines des structures de base et des concepts de base du langage de programmation C. Nous avons examiné son histoire, les caractéristiques qu'il a en commun avec d'autres langages de programmation et les caractéristiques importantes qui en font une option unique et polyvalente pour le codage de logiciels. Passez à la page suivante pour plus d'informations, y compris des guides de programmation qui vous mèneront plus loin dans votre voyage vers C.
Beaucoup plus d'informations
Articles Liés
- Les bases de la programmation C
- Comment fonctionne Java
- Comment fonctionne la logique booléenne
- Comment fonctionne PERL
- Comment fonctionne le BIOS
- Fonctionnement des scripts CGI
- Comment fonctionnent les bits et les octets
Plus de grands liens
- Tutoriel C Programming.com
- Programmation en C sur Wikibooks
- Collection de compilateurs GNU (GCC)
- Logiciel d'environnement de développement intégré Eclipse
Sources
- Kernighan, Brian W. et Ritchie, Dennis M. "Langage de programmation C, deuxième édition." Prentice Hall. 1988.
- King, KN "Programmation C : Une approche moderne, deuxième édition." WW Norton & Company, Inc. 2008.