¿Cuál es la diferencia entre int const * p y const int * p?


Respuesta 1:

Hola a todos,

la pregunta involucra dos cosas Constante y Puntero. Ahora todos sabemos que si una variable se declara como constante, entonces no podemos cambiar su valor y Un puntero es una variable que almacena la dirección de otra variable.

Y también hay dos operadores que encontramos en puntero & y *. & es para asignar la dirección de la variable al puntero y * se usa para referirse al valor de esa ubicación a la que apunta el puntero.

Ahora llegando a la pregunta,

const int * p es un puntero a una variable constante y, como todos sabemos, no podemos cambiar el valor de una constante, por lo que la siguiente operación no es válida y genera un error.

* p = 3; // inválido aquí estamos tratando de modificar una variable constante.

Pero p = & i; // es VÁLIDO, puedo ser cualquier variable

hay una forma más de especificar el puntero a una constante, es decir

int const * p1; // puntero a int constante

hay un tipo más de declaración que vemos, es decir, int * const p, esto se conoce como un puntero constante significa que la dirección a la que apunta no se puede cambiar, por lo que operaciones como

* p = 3; // considerado como válido ya que se cambia el valor de la variable.

PERO p = & i; // se considera inválido porque intenta cambiar el valor de la constante.

También es posible declarar un puntero constante a una constante. En ese caso, ni el valor del puntero ni el valor del elemento de datos base se pueden cambiar. la sintaxis es

const int * const p;

Aquí hay una forma de recordar la sintaxis, es decir, en PUNTERO CONSTANTE, "const" siempre viene después de *.

si desea leer más sobre esta visita, geeksforgeeks y busque el calificador constante en C, tiene un programa que le explicará más.

Espero que esto aclare algunas dudas.


Respuesta 2:

int const * p => p es un puntero constante a una variable entera y en la que la dirección apuntada por p será constante (no se puede cambiar) y el valor en esa dirección se puede cambiar

const int * p => p es un puntero a una variable entera constante y en el que el valor en la dirección apuntada por p será constante y la dirección apuntada por p puede cambiarse


Respuesta 3:
Const y punteros:

Es importante diferenciar entre un puntero a una constante y un
puntero constante a una variable.

Aquí hay un puntero a una constante:

  const int * p;

La siguiente declaración es ilegal porque intenta cambiar el
valor de una constante:

  * p = 3;

Pero este es legal, porque el puntero en sí no es una constante:

  p = & x;

Por otro lado, esta declaración muestra un puntero constante a una variable.

  int * const p;

En ese caso, la siguiente declaración es legal, ya que la variable se puede cambiar:

  * p = 3;

pero este no lo es, porque intenta cambiar el valor de una constante.

  p = & x;

Es posible declarar un puntero constante a una constante. En eso
ni el valor del puntero ni el valor de los datos base
El artículo puede ser cambiado:

  const int * const p;


Aquí hay una forma de recordar la sintaxis (de Bjarne Stroustrup):

Tenga en cuenta que en los punteros const, "const" siempre viene después de "*". por
ejemplo:

  int * const p1 = q; // puntero constante a la variable int
  int const * p2 = q; // puntero a int constante
  const int * p3 = q; // puntero a int constante

Otra forma es pensar en '*' como la captura de la mayor izquierda
unidad que puede. 'Const' captura la unidad más pequeña, izquierda o derecha,
eso es can. Así que piense en los ejemplos anteriores como:

  (int *) const p1 = q; // puntero constante a la variable int
  (int const) * p2 = q; // puntero a int constante
  (const int) * p3 = q; // puntero a int constante

En otras palabras, el calificador que precede inmediatamente a la variable es
La primera palabra de la definición.


Respuesta 4:
Const y punteros:

Es importante diferenciar entre un puntero a una constante y un
puntero constante a una variable.

Aquí hay un puntero a una constante:

  const int * p;

La siguiente declaración es ilegal porque intenta cambiar el
valor de una constante:

  * p = 3;

Pero este es legal, porque el puntero en sí no es una constante:

  p = & x;

Por otro lado, esta declaración muestra un puntero constante a una variable.

  int * const p;

En ese caso, la siguiente declaración es legal, ya que la variable se puede cambiar:

  * p = 3;

pero este no lo es, porque intenta cambiar el valor de una constante.

  p = & x;

Es posible declarar un puntero constante a una constante. En eso
ni el valor del puntero ni el valor de los datos base
El artículo puede ser cambiado:

  const int * const p;


Aquí hay una forma de recordar la sintaxis (de Bjarne Stroustrup):

Tenga en cuenta que en los punteros const, "const" siempre viene después de "*". por
ejemplo:

  int * const p1 = q; // puntero constante a la variable int
  int const * p2 = q; // puntero a int constante
  const int * p3 = q; // puntero a int constante

Otra forma es pensar en '*' como la captura de la mayor izquierda
unidad que puede. 'Const' captura la unidad más pequeña, izquierda o derecha,
eso es can. Así que piense en los ejemplos anteriores como:

  (int *) const p1 = q; // puntero constante a la variable int
  (int const) * p2 = q; // puntero a int constante
  (const int) * p3 = q; // puntero a int constante

En otras palabras, el calificador que precede inmediatamente a la variable es
La primera palabra de la definición.


Respuesta 5:
Const y punteros:

Es importante diferenciar entre un puntero a una constante y un
puntero constante a una variable.

Aquí hay un puntero a una constante:

  const int * p;

La siguiente declaración es ilegal porque intenta cambiar el
valor de una constante:

  * p = 3;

Pero este es legal, porque el puntero en sí no es una constante:

  p = & x;

Por otro lado, esta declaración muestra un puntero constante a una variable.

  int * const p;

En ese caso, la siguiente declaración es legal, ya que la variable se puede cambiar:

  * p = 3;

pero este no lo es, porque intenta cambiar el valor de una constante.

  p = & x;

Es posible declarar un puntero constante a una constante. En eso
ni el valor del puntero ni el valor de los datos base
El artículo puede ser cambiado:

  const int * const p;


Aquí hay una forma de recordar la sintaxis (de Bjarne Stroustrup):

Tenga en cuenta que en los punteros const, "const" siempre viene después de "*". por
ejemplo:

  int * const p1 = q; // puntero constante a la variable int
  int const * p2 = q; // puntero a int constante
  const int * p3 = q; // puntero a int constante

Otra forma es pensar en '*' como la captura de la mayor izquierda
unidad que puede. 'Const' captura la unidad más pequeña, izquierda o derecha,
eso es can. Así que piense en los ejemplos anteriores como:

  (int *) const p1 = q; // puntero constante a la variable int
  (int const) * p2 = q; // puntero a int constante
  (const int) * p3 = q; // puntero a int constante

En otras palabras, el calificador que precede inmediatamente a la variable es
La primera palabra de la definición.