Voici mon prendre sur elle:
Le Développement du Langage C offre un aperçu de l'évolution du type de tableau dans C:
Je vais essayer de décrire le tableau de chose:
C précurseurs B et BCPL avait pas de distinction de type tableau, une déclaration comme:
auto V[10] (B)
or
let V = vec 10 (BCPL)
déclarer V (non typé) pointeur est initialisé à point à un solde non utilisé de la région de 10 "mots" de la mémoire. B déjà utilisé *
pour le déréférencement du pointeur et avait l' []
court main notation, *(V+i)
signifiait V[i]
, tout comme en C/C++ aujourd'hui. Toutefois, V
n'est pas un tableau, c'est toujours un pointeur qui a pour point de mémoire. Ce qui a causé le problème quand Dennis Ritchie a essayé d'étendre B avec struct types. Il voulait des matrices à une partie de leurs structures, comme dans C aujourd'hui:
struct {
int inumber;
char name[14];
};
Mais avec le B,BCPL concept de tableaux de pointeurs, il aurait fallu, pour l' name
champ pour contenir un pointeur qui devait être initialisé lors de l'exécution d'une région de mémoire de 14 octets à l'intérieur de la structure. L'initialisation/layout problème a finalement été résolu en donnant des tableaux d'un traitement spécial: Le compilateur permettrait de suivre l'emplacement de tableaux dans les structures, sur la pile etc. sans réellement exigeant le pointeur vers les données de matérialiser, sauf dans les expressions qui impliquent les tableaux. Ce traitement a permis presque tous les B code de toujours exécuter et est la source de la "tableaux de convertir pointeur si vous regardez" la règle. C'est une mise à niveau hack, qui s'est avéré être très pratique, car il a permis à des tableaux de ouvert taille etc.
Et voici ma deviner pourquoi le tableau ne peut pas être attribué: comme les tableaux ont été pointeurs dans B, il vous suffit d'écrire:
auto V[10];
V=V+5;
pour rebase un "tableau". C'était maintenant vide de sens, parce que la base d'une variable de tableau n'était pas une lvalue plus. Donc, cette affectation a été refusé, ce qui a aidé à attraper les quelques programmes qui ne ce rebasage déclarées tableaux. Et puis cette notion coincé: Que les tableaux n'ont jamais été conçus pour être premier de la classe citized de la C type de système, ils ont été pour la plupart traités spéciaux bêtes qui deviennent pointeur si vous les utilisez. Et à partir d'un certain point de vue (qui ignore que le C-les tableaux sont bâclé hack), le refus de tableau d'affectation fait encore des sens: ouvrir Un tableau ou un tableau en paramètre de la fonction est considéré comme un pointeur sans informations sur la taille. Le compilateur n'ont pas l'information pour générer un tableau d'affectation pour eux et le pointeur de la cession a été nécessaire pour des raisons de compatibilité. L'introduction de tableau d'affectation pour l'déclaré tableaux ont introduit des bugs si fausses assignations (a=b un pointeur cession ou d'une elementwise copie?) et d'autres problèmes (comment passer un tableau de la valeur?) sans la résolution d'un problème - il suffit de faire tout ce qui explicite avec memcpy!
/* Example how array assignment void make things even weirder in C/C++,
if we don't want to break existing code.
It's actually better to leave things as they are...
*/
typedef int vec[3];
void f(vec a, vec b)
{
vec x,y;
a=b; // pointer assignment
x=y; // NEW! element-wise assignment
a=x; // pointer assignment
x=a; // NEW! element-wise assignment
}
Cela n'a pas changé lors de la révision de la C en 1978 ajoutée structure d'affectation ( http://cm.bell-labs.com/cm/cs/who/dmr/cchanges.pdf ). Même si les enregistrements ont été de deux types distincts de C, il n'était pas possible de les attribuer au début de K&R C. Vous avez eu à copier des membres de la sagesse avec memcpy et vous pouvez passer uniquement les pointeurs comme paramètres de la fonction. Affectation (et passage de paramètres) est maintenant défini simplement comme le memcpy de la structure de la mémoire brute et depuis cela ne pouvait pas briser la gratuit de code, on a facilement adpoted. Comme un effet secondaire involontaire, ce implicitement introduit une sorte de tableau d'affectation, mais cette lancée quelque part à l'intérieur d'une structure, donc ce n'est pas vraiment de créer des problèmes avec la manière dont les tableaux ont été utilisés.