Vous êtes sur la page 1sur 16

PROGRAMMATION C

LES TABLEAUX

Mr R. TLEMSANI

CAS GNRAL
Dans le cas le plus simple la dclaration d'un tableau se fait par une formule comme : type-de-base nom [ expressionopt ] ; Exemple : unsigned long table[10]; L'expression optionnelle qui figure entre les crochets spcifie le nombre d'lments du tableau. Le premier lment possde toujours l'indice 0. Par consquent, un tableau t dclar de taille N possde les lments t0; t1; ::: tN-1. Ainsi la dfinition prcdente alloue un tableau de 10 lments, nomms respectivement table[0], table[1], ... table[9]. L'expression optionnelle qui figure entre les crochets doit tre de type entier et constante au sens, c'est-dire une expression dont tous les lments sont connus au moment de la compilation. De cette manire le compilateur peut l'valuer et connatre la quantit d'espace ncessaire pour loger le tableau. Elle est obligatoire lorsqu'il s'agit d'une dfinition, car il y a alors allocation effective du tableau. Elle est facultative dans le cas des dclarations qui ne sont pas des dfinitions, c'est--dire : lors de la dclaration d'un tableau qui est un argument formel d'une fonction ; lors de la dclaration d'un tableau externe (dfini dans un autre fichier).

CAS GNRAL suite


Smantique du nom d'un tableau. En gnral lorsque le nom d'un tableau apparait dans une expression il y joue le mme rle qu'une constante de type adresse ayant pour valeur l'adresse du premier lment du tableau. Autrement dit, si t est de type tableau, les deux expressions t &t[0] sont quivalentes. Les exceptions cette rgle, c'est--dire les expressions de type tableau qui ne sont pas quivalentes l'adresse du premier lment du tableau, sont l'occurrence du nom du tableau dans sa propre dclaration ; l'apparition d'un nom du tableau comme argument de sizeof. Ce sont les seules occasions ou le compilateur veut bien se souvenir qu'un nom de tableau reprsente aussi un espace mmoire possdant une certaine taille. De tout cela, il faut retenir en tout cas que le nom d'un tableau n'est pas une valeur et donc qu'il n'est pas possible d'affecter un tableau un autre. Si a et b sont deux tableaux, mme ayant des types identiques, l'affectation b = a sera comprise comme l'affectation d'une adresse une autre, et rejete, car b n'est pas modifiable.

CAS GNRAL suite


Tableaux multidimensionnels. C ne prvoit que les tableaux un seul indice, mais les lments des tableaux peuvent leur tour tre des tableaux. La dclaration d'un tableau avec un nombre quelconque d'indices suit la syntaxe : type nom [ expressionopt ] [ expressionopt ] ... [ expressionopt ] qui est un cas particulier de formules plus gnrales expliques la section 5.4.1. Par exemple, la dclaration double matrice[10][20]; introduit matrice comme tant le nom d'un tableau de 10 lments qui, chacun son tour, est un tableau de 20 lments de type double. Remarque Dans le cas d'une matrice, la coutume est d'appeler ces lments les lignes de la matrice. Cela permet de dire alors : en C les matrices sont ranges par lignes .

INITIALISATION DES TABLEAUX


Une variable de type tableau peut tre initialise lors de sa dclaration. Cela se fait par une expression ayant la syntaxe : f expression , expression , ... expression g Exemple : int t[5] = {10,20,30,40,50}; Les expressions indiques doivent tre des expressions constantes au sens de la section 1.3.4. S'il y a moins d'expressions que le tableau a d'lments, les lments restants sont remplis de zros (cas des variables globales) ou bien restent indtermins (cas des variables locales). S'il y a plus d'expressions d'initialisation que d'lments dans le tableau, une erreur est signale.

INITIALISATION DES TABLEAUX suite


D'autre part, la prsence d'un initialisateur dispense d'indiquer la taille du tableau. Il est convenu que ce dernier doit avoir alors pour taille le nombre effectif de valeurs initiales. Par exemple, la dfinition int t[] = {10,20,30,40,50}; alloue un tableau 5 composantes garni avec les valeurs indiques. Lorsque le tableau comporte des sous-tableaux, c'est--dire lorsque c'est un tableau plusieurs indices, la liste des expressions d'initialisation peut comporter des sous-listes indiques leur tour avec des accolades, mais ce n'est pas une obligation. Le cas chant, la rgle de compltion par des zros s'applique aussi aux sous-listes.

CHAINES DE CARACTRES
Les chaines de caractres sont reprsentes comme des tableaux de caractres. Un caractre nul suit le dernier caractre utile de la chaine et en indique la fin. Cette convention est suivie par le compilateur (qui range les chaines constantes en leur ajoutant un caractre nul), ainsi que par les fonctions de la librairie standard qui construisent des chaines. Elle est suppose vrifie par les fonctions de la librairie standard qui exploitent des chaines. Par consquent, avant de passer une chaine une telle fonction, il faut s'assurer qu'elle comporte bien un caractre nul la fin. Donnons un exemple classique de traitement de chaines : la fonction strlen (extraite de la bibliothque standard) qui calcule le nombre de caractres utiles d'une chaine : int strlen(char s[]) { register int i = 0; while (s[i++] != '\0') ; return i - 1; }

CHAINES DE CARACTRES suite


Une constante-chaine de caractres apparaissant dans une expression a le mme type qu'un tableau de caractres c'est--dire, pour l'essentiel, le type adresse d'un caractre . Par exemple, si p a t dclar char *p; l'affectation suivante est tout fait lgitime : p = "Bonjour. Comment allez-vous?"; Elle affecte p l'adresse de la zone de la mmoire ou le compilateur a rang le texte en question (l'adresse du 'B de "Bonjour..."). Dans ce cas, bien que l'expression *p soit une valeur(ce qui est une proprit syntaxique), elle ne doit pas tre considre comme telle car *p reprsente un objet mmoris dans la zone des constantes, et toute occurrence de *p comme oprande gauche d'une affectation : *p = expression; Constituerait une tentative de modification d'un objet constant. Cette erreur est impossible dceler la compilation.

CHAINES DE CARACTRES suite


Selon le systme sous-jacent, soit une erreur sera signale l'excution, provoquant l'abandon immdiat du programme, soit aucune erreur ne sera signale mais la validit de la suite du traitement sera compromise. Initialisation. Comme tous les tableaux, les variables-chaines de caractres peuvent tre initialises lors de leur dclaration. De ce qui a t dit pour les tableaux en gnral il dcoule que les expressions suivantes sont correctes : char message1[80] = { 'S', 'a', 'l', 'u', 't', '\0' }; char message2[] = { 'S', 'a', 'l', 'u', 't', '\0' }; (la deuxime formule dfinit un tableau de taille 6). Heureusement, C offre un raccourci : les deux expressions prcdentes peuvent s'crire de manire tout fait quivalente : char message1[80] = "Salut"; char message2[] = "Salut"; Il faut bien noter cependant que l'expression "Salut" qui apparait dans ces deux exemples n'est pas du tout trait par le compilateur comme les autres chaines de caractres constantes rencontres dans les programmes. Ici, il ne s'agit que d'un moyen commode pour indiquer une collection de valeurs initiales ranger dans un tableau.

LES TABLEAUX STATIQUES 1 DIMENSION


dfinition
Ensemble de variables de mme type, de mme nom caractrises par un index.

dclaration
type nom_tableau[dimension]

exemples:
char buffer[80]; int mat[10];
doit tre une constante

LES TABLEAUX STATIQUES 1 DIMENSION suite


accs aux lments du tableau
Nom_tableau[indice]

exemples:
buffer[5] = 'c'; mat[6] = 10;

le premier lment commence l'indice 0 !! Les valeurs ne sont pas initialises !! Les dbordements ne sont pas vrifis

Les tableaux statiques 2 dimensions et plus


dfinition
Il s'agit d'un tableau de tableaux

dclaration
type nom_tableau[dim1][dim2][dimn]

exemples:
char buffer[20][80]; int mat[6][10]; char livres[100][60][80];

Les tableaux statiques 2 dimensions et plus


accs aux lments
nom_tableau[ind1][ind2][indn]

exemples:
livre[30][15][20] = 'c'; mat[5][6] =13; cout << mat[5][6]<<'\n';

Initialisation dynamique d'un tableau


Tableau une dimension
int * t; t = (int*)malloc(20*sizeof(int));
nom du tableau fonction d'allocation dynamique de la mmoire nombre d'lments dans le tableau fonction de calcul automatique de la taille d'un entier en octet

Initialisation dynamique d'un tableau suite


Tableau deux dimensions n*m dclaration dynamique du tableau de n pointeurs et des n tableaux une dimension de m lments quelques lignes de code sont ncessaires (voir transparent suivant)

Initialisation dynamique d'un tableau suite


Tableau deux dimensions n*m
int **TAB,l;
TAB = (int**)malloc(n*sizeof(int*)); for (l=0;l<n;l++) { TAB[l] = (int*)malloc(m*sizeof(int)); } dsallocation: for (l=0;l<n;l++) free(TAB[l]); free(TAB);

Vous aimerez peut-être aussi