En C++, quelle est la différence (le cas échéant) entre l'utilisation de char et de char[1].
exemples :
struct SomeStruct
{
char x;
char y[1];
};
Les mêmes raisons s'appliquent-elles aux caractères non signés ?
En C++, quelle est la différence (le cas échéant) entre l'utilisation de char et de char[1].
exemples :
struct SomeStruct
{
char x;
char y[1];
};
Les mêmes raisons s'appliquent-elles aux caractères non signés ?
La principale différence réside dans la syntaxe que vous utilisez pour accéder à votre caractère unique.
Par "accéder", j'entends agir sur le document à l'aide des différents opérateurs du langage, dont la plupart, voire tous, font des choses différentes lorsqu'ils sont appliqués à un fichier char
par rapport à un char
réseau. Cela donne l'impression que x
y y
sont presque entièrement différents. En fait, ils sont tous deux "constitués" d'un seul personnage, mais celui-ci a été représenté d'une manière très différente.
La mise en œuvre podría Il pourrait y avoir d'autres différences, par exemple, il pourrait aligner et rembourrer la structure différemment selon le modèle que vous utilisez. Mais je doute que ce soit le cas.
Un exemple des différences entre opérateurs est qu'un char est assignable, et qu'un tableau ne l'est pas :
SomeStruct a;
a.x = 'a';
a.y[0] = 'a';
SomeStruct b;
b.x = a.x; // OK
b.y = a.y; // not OK
b.y[0] = a.y[0]; // OK
Mais le fait que y
n'est pas cessible ne s'arrête pas SomeStruct
étant cessibles :
b = a; // OK
Et ce, quel que soit le type, char
ou pas. Un objet d'un certain type, et un tableau de ce type avec une taille de 1, sont à peu près les mêmes en termes de ce qui se trouve en mémoire.
Soit dit en passant, il y a un contexte dans lequel il y a une grande différence entre ce que vous "utilisez" et ce que vous ne faites pas. char
y char[1]
et qui contribue parfois à faire croire aux gens que les tableaux sont en réalité des pointeurs. Pas dans votre exemple, mais comme paramètre de fonction :
void foo(char c); // a function which takes a char as a parameter
void bar(char c[1]); // a function which takes a char* as a parameter
void baz(char c[12]); // also a function which takes a char* as a parameter
Les chiffres fournis dans les déclarations de bar
y baz
sont complètement ignorés par le langage C++. Apparemment, quelqu'un a estimé à un moment donné qu'il serait utile aux programmeurs de disposer d'une forme de documentation indiquant que la fonction baz
attend de son argument pointeur qu'il pointe sur le premier élément d'un tableau de 12 caractères.
En bar et baz, c
n'a jamais de type tableau - cela ressemble à un type tableau, mais ce n'en est pas un, c'est juste une syntaxe fantaisiste de cas spécial avec la même signification que char *c
. C'est pourquoi j'ai mis des guillemets à "utiliser" - vous n'utilisez pas vraiment char[1]
du tout, ça y ressemble juste.
Si vous avez vu la construction char y[1]
en tant que dernier membre d'une structure dans un code de production, alors il est assez probable que vous ayez rencontré une instance de la fonction struct hack .
Ce tableau court est un stand-in pour un tableau réel, mais de longueur variable (rappelez-vous qu'avant c99 il n'y avait rien de tel dans le standard c). Le programmeur allouait toujours de telles structures sur le tas, en prenant soin de s'assurer que l'allocation était suffisamment grande pour la taille réelle du tableau qu'il voulait utiliser.
En plus des différences d'usage notées par Steve, char[1] peut être passé à par exemple template <int N> void f(char(&a)[N])
, donde char x = '\0'; f(&x);
ne correspondait pas. Capturer de manière fiable la taille des arguments d'un tableau est très pratique et rassurant.
Cela peut également impliquer quelque chose de différent : soit que la longueur réelle peut être plus longue (comme expliqué par dmckee), soit que le contenu est logiquement une chaîne ASCIIZ (qui se trouve être vide dans ce cas), ou un tableau de caractères (qui se trouve avoir un élément). Si la structure était l'une de plusieurs structures apparentées (par exemple, un vecteur mathématique où la taille du tableau était un argument de modèle, ou un encodage de la disposition de la mémoire nécessaire pour une opération d'E/S), il est tout à fait possible qu'une certaine similitude avec d'autres champs où les tableaux peuvent être plus grands suggère une préférence pour un tableau à un seul caractère, permettant au code de support d'être plus simple et/ou plus universellement applicable.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.