Je veux connaître la différence entre
const int* ptr;
et
int * const ptr;
et comment ça marche.
Il m'est difficile de comprendre ou de garder cela à l'esprit. S'il vous plaît aider.
const int* ptr;
déclare ptr
un pointeur sur le type const int
. Vous pouvez modifier ptr
lui-même, mais l'objet pointé par ptr
ne doit pas être modifié.
const int a = 10;
const int* ptr = &a;
*ptr = 5; // wrong
ptr++; // right
Tandis que
int * const ptr;
déclare ptr
un const
pointeur sur le type int
. Vous n'êtes pas autorisé à modifier ptr
mais l'objet pointé par ptr
.
int a = 10;
int *const ptr = &a;
*ptr = 5; // right
ptr++; // wrong
Généralement, je préférerais une déclaration comme celle-ci, qui facilite la lecture et la compréhension (lecture de droite à gauche):
int const *ptr; // ptr is a pointer to constant int
int *const ptr; // ptr is a constant pointer to int
const int * ptr;
signifie que les données pointées sont constantes et immuables mais que le pointeur ne l’est pas.
int * const ptr;
signifie que le pointeur est constant et immuable, mais pas les données pointées.
1) Pointeurs constants: Ces types de pointeurs sont ceux qui ne peuvent pas changer l'adresse vers laquelle ils pointent. Cela signifie que supposons qu'il existe un pointeur qui pointe vers une variable (ou stocke l'adresse de cette variable). Maintenant, si nous essayons de faire pointer le pointeur vers une autre variable (ou d'essayer de faire en sorte que l'adresse du pointeur enregistre l'adresse d'une autre variable), les pointeurs constants sont incapables de le faire.
Un pointeur constant est déclaré comme: int *const ptr
(l'emplacement de 'const' fait en sorte que le pointeur 'ptr' devienne un pointeur constant)
2) Pointeur sur constante: Ces types de pointeurs sont ceux qui ne peuvent pas changer la valeur vers laquelle ils pointent. Cela signifie qu'ils ne peuvent pas changer la valeur de la variable dont ils ont l'adresse.
Un pointeur sur une constante est déclaré en tant que: const int *ptr
(l'emplacement de 'const' rend le pointeur 'ptr' en tant que pointeur sur une constante.
Exemple
Pointeur constant
#include<stdio.h>
int main(void)
{
int a[] = {10,11};
int* const ptr = a;
*ptr = 11;
printf("\n value at ptr is : [%d]\n",*ptr);
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
ptr++;
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
return 0;
}
Maintenant, lorsque nous compilons le code ci-dessus, le compilateur se plaint:
practice # gcc -Wall constant_pointer.c -o constant_pointer
constant_pointer.c: In function ‘main’:
constant_pointer.c:13: error: increment of read-only variable ‘ptr’
Nous voyons donc très clairement ci-dessus que le compilateur se plaint de ne pas pouvoir modifier l'adresse détenue par un pointeur constant.
Pointeur sur les constantes
#include<stdio.h>
int main(void)
{
int a = 10;
const int* ptr = &a;
printf("\n value at ptr is : [%d]\n",*ptr);
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
*ptr = 11;
return 0;
}
Maintenant, lorsque le code ci-dessus est compilé, le compilateur se plaint:
practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant
pointer_to_constant.c: In function ‘main’:
pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’
Nous voyons donc également ici que le compilateur ne permet pas au pointeur sur une constante de changer la valeur de la variable pointée.
Renvoi de This Thread
Pointeurs constants
Permet de comprendre ce qu'est un pointeur constant. Un pointeur constant est un pointeur qui ne peut pas changer l'adresse qu'il détient. En d'autres termes, nous pouvons dire qu'une fois qu'un pointeur constant pointe vers une variable, il ne peut pas pointer vers une autre variable.
Un pointeur constant est déclaré comme suit:<type of pointer> * const <name of pointer>
Un exemple de déclaration ressemblerait à ceci:int * const ptr;
Prenons un petit code pour illustrer ces types de pointeurs:
#include<stdio.h>
int main(void)
{
int var1 = 0, var2 = 0;
int *const ptr = &var1;
ptr = &var2;
printf("%d\n", *ptr);
return 0;
}
Dans l'exemple ci-dessus:
Pointeur sur constante
Comme son nom l’indique, un pointeur par lequel on ne peut pas changer la valeur de la variable qu’il pointe est appelé pointeur sur une constante. Ces types de pointeurs peuvent changer l'adresse vers laquelle ils pointent mais ne peuvent pas changer la valeur conservée à cette adresse.
Un pointeur sur une constante est défini comme suit: const <type of pointer>* <name of pointer>
Un exemple de définition pourrait être: const int* ptr;
Prenons un petit code pour illustrer un pointeur sur une constante:
#include<stdio.h>
int main(void)
{
int var1 = 0;
const int* ptr = &var1;
*ptr = 1;
printf("%d\n", *ptr);
return 0;
}
Dans le code ci-dessus:
const int* ptr;
est un pointeur sur une constante (contenu). Vous êtes autorisé à modifier le pointeur. par exemple. ptr = NULL
, ptr++
, mais la modification du contenu est non possible.
int * const ptr;
Est un pointeur constant. Le contraire est possible. Vous êtes pas autorisé à modifier le pointeur, mais vous êtes autorisé à modifier son objet, par exemple. *ptr += 5
.
int i;
int j;
int * const ptr1 = &i;
Le compilateur vous arrêtera de changer ptr1
.
const int * ptr2 = &i;
Le compilateur vous arrêtera de changer *ptr2
.
ptr1 = &j; // error
*ptr1 = 7; // ok
ptr2 = &j; // ok
*ptr2 = 7; // error
Notez que vous pouvez toujours changer *ptr2
, mais pas en tapant littéralement *ptr2
:
i = 4;
printf("before: %d\n", *ptr2); // prints 4
i = 5;
printf("after: %d\n", *ptr2); // prints 5
*ptr2 = 6; // still an error
Vous pouvez également avoir un pointeur avec les deux fonctionnalités:
const int * const ptr3 = &i;
ptr3 = &j; // error
*ptr3 = 7; // error
const int* ptr;
pense ici comme * ptr est constant et * ptr ne peut plus être changé
int * const ptr;
alors qu'ici pense comme une constante et ne peut plus être changé
Veuillez vous référer au lien suivant pour une meilleure compréhension de la différence entre le pointeur Const et le pointeur sur une valeur constante.