Maison >développement back-end >C++ >Pourquoi ne puis-je pas convertir un pointeur à pointeur en non-const en un pointeur à pointeur en const en C ?

Pourquoi ne puis-je pas convertir un pointeur à pointeur en non-const en un pointeur à pointeur en const en C ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-01 02:42:09525parcourir

Why Can't I Convert a Pointer-to-Pointer to Non-Const to a Pointer-to-Pointer to Const in C  ?

Conversion de pointeurs : pourquoi des restrictions sur les conversions de pointeur à pointeur ?

En C, il est généralement permis de lancer un pointeur vers un non -type const vers un pointeur vers un type const. Cela suit le principe de « const-correctness », permettant uniquement de modifier des données constantes.

Cependant, une exception particulière se produit lorsqu'il s'agit de pointeurs vers des pointeurs. Contrairement à la conversion susmentionnée, il est interdit de convertir un « pointeur vers pointeur vers non-const » en un « pointeur vers pointeur vers const ».

Considérez cet extrait de code :

char *s1 = 0;
const char *s2 = s1; // OK...
char *a[MAX]; // aka char **
const char **ps = a; // error!

Pourquoi l'affectation de a à ps est-elle illégale ? La réponse réside dans la norme :

const char c = 'c';
char* pc;
const char** pcc = &pc;   // not allowed
*pcc = &c;
*pc = 'C';                // would allow to modify a const object

Dans cet exemple :

  1. c est un caractère constant.
  2. pc est un pointeur non const vers un caractère.
  3. Tenter d'initialiser pcc (un pointeur vers un pointeur vers const) avec &pc est interdit.

Si cette conversion était autorisée, elle permettrait de modifier les objets constants. Par exemple, *pcc pointerait vers un caractère const, mais *pc serait modifiable. Cela viole le principe de l'exactitude const, car cela permet potentiellement de modifier des données constantes.

Par conséquent, la restriction relative à la conversion d'un pointeur en pointeur vers non-const en un pointeur en pointeur vers const découle de la nécessité de maintenir l'intégrité des objets constants et empêcher les modifications involontaires des données.

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!

Déclaration:
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