Maison > développement back-end > C++ > le corps du texte

La question tacite : \'Pourquoi les pointeurs existent-ils ?\'

WBOY
Libérer: 2024-07-16 16:20:01
original
214 Les gens l'ont consulté

The unspoken question:

C'est vraiment une question valable

Ce n'est pas une question typique de ceux qui détestent les pointeurs, mais plutôt une question très intéressante.


Voici ce que je veux dire

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.


Un regard plus profond

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.

Opérateur de syntaxe et de déréférencement

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
Copier après la connexion

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;
Copier après la connexion

Dans ce cas, vous pourriez même faire des choses comme ceci :

int firstIntInMemory = *(0); //manually dereferences (4bytes at) adress 0`
Copier après la connexion

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.

Arithmétique du pointeur

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);
Copier après la connexion

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));
Copier après la connexion

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.


Ce n'est pas tout

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.


Dernier mot

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!