Ce n'est pas une question typique de ceux qui détestent les pointeurs, mais plutôt une question très intéressante.
Les pointeurs sont un concept très puissant, mais c'est ce que c'est : un concept. Alors pourquoi le compilateur C a-t-il été inventé avec un élément de logique et de syntaxe aussi isolé dédié aux pointeurs ?
Ne vous méprenez pas, j'aime les opportunités que nous offrent les pointeurs et leur syntaxe actuelle. Ils constituent une fonctionnalité absolument essentielle, ayant permis l'évolution des structures de données dynamiques, des objets et des classes, le partage de mémoire multithread, la mutabilité des objets, la duplication de valeurs à faible redondance et bien plus encore.
Mais si vous imaginez l'événement de l'invention du C, les pointeurs actuels semblent une idée beaucoup plus impressionnante qu'un premier concept intuitif. Examinons de plus près ce que je veux dire.
Si vous regardez la structure d'un pointeur, il s'agit essentiellement d'un long non signé (c'est-à-dire 4 [système 32 bits] ou 8 octets en mémoire). Les éléments qui séparent les pointeurs des longs non signés sont les fonctionnalités spécifiques au pointeur.
Un pointeur possède sa propre syntaxe de déclaration et possède son opérateur propriétaire : le déréférenceur.
int a = 5; int *ptr = &a; //declaration int value = *ptr; //dereference
Mais imaginons que cela n'ait jamais été inventé. Ensuite, ce qui suit serait facilement possible si la fonction de déréférencement était simplement associée à n'importe quel type entier :
int a = 5; unsigned long adress = &a; int value = *adress;
Dans ce cas, vous pourriez même faire des choses comme ceci :
int firstIntInMemory = *(0); //manually dereferences (4bytes at) adress 0`
En parlant de l'analyseur, il ne s'agit absolument pas d'une syntaxe conflictuelle puisque l'étoile en tant que déréfrenceur est un opérateur unaire tandis que l'étoile en tant que multiplicateur arithmétique est toujours un opérateur binaire.
Cet opérateur de déréférencement fictif, tel que je l'ai décrit ci-dessus, est en réalité l'essence même du concept de pointeur. En comparant cela à la mise en œuvre réelle actuelle, la question principale est si intéressante à réfléchir. Il aurait pu y avoir tellement de résultats.
La seule chose particulière que fait l'arithmétique des pointeurs est de prendre en compte la taille des caractères dans les calculs. Lorsque j'ai un tableau et que je veux obtenir le deuxième élément, j'ajoute simplement 1 au pointeur. S'il s'agit d'un pointeur int, cela ajoutera implicitement une valeur de 4 à l'adresse (si sizeof(int) == 4 sur votre système) :
int arr[5] = {1,2,3,4,5}; int second = *(arr + 1);
Mais soyons honnêtes, ce qui suit est en réalité beaucoup plus logique si vous pensez intuitivement à la mémoire :
int arr[5] = {1,2,3,4,5}; int second = *(arr + sizeof(int));
Et ce serait juste de l’arithmétique entière standard. Si vous regardez les choses de cette façon, il n’y a pas vraiment de raison d’avoir inventé l’arithmétique des pointeurs.
Bien sûr, la syntaxe '*' rend les utilisations prévues beaucoup plus claires. Si vous la voyez, vous savez immédiatement que cette variable est utilisée pour la manipulation de la mémoire. De plus, chaque fonction de la bibliothèque de manipulation de mémoire est conçue pour les pointeurs.
Mais quand même, si cela n'avait jamais été inventé, et à la place nous avions ces longs non signés déréférençables, les gens auraient simplement trouvé des conventions de conception et de dénomination, comme ajouter des identifiants de variable de pointeur avec un suffixe '_p'. Et les bibliothèques de manipulation de mémoire auraient simplement évolué autour de cela.
Donc vraiment, si vous y réfléchissez, C aurait pu survivre de la même manière qu'il vit actuellement si les pointeurs n'avaient jamais été inventés en tant que fonctionnalité du langage. Ils seraient simplement inventés en tant que concept par des programmeurs, fonctionnant de la même manière qu'ils existent actuellement.
Je trouve que c'est une histoire intéressante à approfondir.
Pourquoi C a-t-il inventé le pointeur ?
Était-ce simplement la raison pour laquelle nous nous attendions : cohérence, clarté et sécurité contre une utilisation abusive du déréférencement ?
Ou existe-t-il une raison plus profonde et une logique beaucoup plus complexe que la façon dont j'ai abordé les pointeurs dans cet article, ce qui les rend en réalité nettement plus efficaces que de faire la même chose avec des entiers à usage général ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!