Tableau

Un tableau t de taille n et de type type définit n variables de type type indicées de 0 à n-1 : t[0] ... t[n-1].

int valeurs[10];
int t[] = {1, 2, 3};

Une chaîne de n caractères est un tableau de n+1 caractères, dont le dernier caractère est le caractère nul '\0'.
char s[] = "Bonjour";

Pointeur

Un pointeur est une variable dont le contenu est une adresse. Son type est donné par le type de la variable pointée suivi de *.
Par exemple int *.

L'adresse d'une variable s'obtient à l'aide de l'opérateur &, le contenu d'une adresse à l'aide de l'opérateur *.
Par exemple :
int * pi = &i;
*pi = *pi + 1; //augmente la valeur de i

Une variable de type tableau est un pointeur constant.
On peut également adresser les éléments d'un tableau à l'aide d'un pointeur ayant le même type que les éléments du tableau.
int t[] = {1, 2, 3}; // t est constant
int * t2 = {1, 2, 3}; // t2 est variable
char * s2 = "Bonjour";

A noter l'existence des pointeurs de fonction dont l'utilisation sera vue ultérieurement.
int (* f)(int) = fact;

Arithmétique des pointeurs

L'arithmétique sur les pointeurs tient compte du type de l'objet pointé. Ainsi, si p est un pointeur vers une variable de type t, et k un entier, p+k sera égal à p+k*sizeof(t).
Ainsi, *(t +i), si t est un tableau, est équivalent à t[i]. Voir test_pointeurs.c.
$ test_pointeurs
&c = bffffbd0, sizeof(c) = 1, pc+1 = bffffbd1
&i = bffffbd8, sizeof(i) = 4, pi+1 = bffffbdc
&s = bffffbe0, sizeof(struct ma_struct) = 8, ps + 1 = bffffbe8
Balayage de t
contenu de bffffc00 = 1
contenu de bffffc04 = 2
contenu de bffffc08 = 3
contenu de bffffc0c = 4

Tableau multi-dimensionnel

Il est possible de créer des tableaux à plusieurs dimensions :
float m[5][10];
Dans ce cas m[i][j] est équivalent à *(m + i*10 + j).
Dans le cas général, si
type t[n1]...[nk];
t[i1]...[ik] sera équivalent à * (t + i1*n2* ... *nk + i2*n3* ... *nk + ... + ik)