Re: [gull] Subtilité de C n° 6 : Tableaux et pointeurs, presque pareils

Marc Mongenet marc at mongenet.ch
Wed Jul 30 20:00:24 CEST 2008


2008/7/30 Daniel Cordey <dc at mjt.ch>:
> On Tuesday 29 July 2008, Marc Mongenet wrote:
>
>>   p = &*((t)+(0));
>
> Technique d'ailleurs utilisee massivement par la librairie X11 afin de
> calculer les "offset" d'un element dans une structure.
>
>> Je rappelle (voir la subtilité n° 5) que C ne permet pas de
>> passer des tableaux en paramètre de fonction.
>
> On dit que le C passe les arguments par "reference", par opposition a d'autres
> langages qui passent les arguments par "valeur". Le passage par reference
> s'est impose comme etant, de tres loin, le plus rapide; puisque l'on garanti
> que l'on passe tous les arguments dans des registres dont la taille est
> inferieur ou egale a un "mot" du CPU.

Je vois ce que tu veux dire, mais attention : en C, les paramètres sont
toujours passés par valeur. Mais la valeur passée est effectivement
souvent un pointeur, et l'on peut effectivement considérer que l'objet
pointé est passé par référence.

Pour le passage par registre, j'ai en revanche de sérieux doutes.
D'abord, il peut y avoir plus d'arguments que de registres disponibles.
Ensuite, les types long, float, double et long double peuvent être plus
longs que le mot processeur (int).
Enfin, il est possible de passer les structures par valeur (c'est une des
nouveautés d'ANSI C introduite dans les années 1980).

>> Que fait ce programme, au juste ?
>
> hi, hi... Tu exageres :-))

Et encore, pour rester concentré sur les propriétés de l'opérateur [],
j'ai résisté à l'envie de présenter le hello world suivant :

#include<stdio.h>
int main() {
  int i = 0;
  while (putchar(i++["hello world\n"]));
}

Marc Mongenet



More information about the gull mailing list