2011-10-12 24 views
7

¿Son válidas las siguientes asignaciones? ¿O alguno de estos creará problemas? Por favor recomiende.asignaciones de puntero const char

const char * c1; 
const char * c2; 
const char * c3; 
char * c4; 

c2 = c1; 
c2 = c3; 
c2 = c4; 

¿Qué pasa si hago lo siguiente? ¿Está bien hacerlo?

const char * c5 = "xyz"; 
char * c6 = "abc"; 

c2 = c5; 
c2 = c6; 
+0

@ Kshitij Mehta - no es una tarea, estamos enfrentando problemas de memoria con nuestra gran base de códigos. Entonces, cualquier ayuda sería apreciada. – user32262

+0

@user Ha hecho la misma pregunta algunas veces. Les hemos respondido una y otra vez. Su edición de esta pregunta no agrega nada. Simplemente repite lo que preguntaste anteriormente. –

+1

Me disculpo si estoy preguntando lo mismo. Tal vez mi comprensión con los punteros no es precisa. – user32262

Respuesta

9

Todos son afirmaciones válidas como a lo largo no lo hace eliminar la referencia de ellos, porque todos los punteros se dejan uninitalized o no están apuntando a todos los lugares de memoria válida.

Y son válidos porque el puntero no es constante, pero el valor apuntado por el puntero es constante. Entonces, los punteros aquí son reasignables para apuntar a una ubicación diferente.

3

Estas asignaciones son perfectamente válidas, como yo y otros hemos explicado en su reciente ejecución de preguntas casi idénticas.

A const char* es un puntero a la memoria que no se puede modificar con ese puntero. Nada aquí puede eludir eso. El compilador se opondría si asignaba c4 = c1, ya que eso evitaría la const.

30

En tu mente dibuja una línea a través del asterisco. A la izquierda es lo que se señaló ya la derecha el tipo de puntero

Por ejemplo

  1. const char * const p - El puntero p es constante y también lo son los personajes que p puntos a - es decir, no pueden cambiar tanto el puntero y el contenido a lo que p señala a
  2. const char * p - p apunta a los caracteres constantes. Puede cambiar el valor de p y hacer que apunte a diferentes caracteres constantes. Pero sea lo que sea que señale p, no puede cambiar el contenido.
  3. char * const p - Usted no puede cambiar el puntero, pero puede cambiar el contenido

y finalmente

  1. char * p - Todo está en juego

espero que ayude.

+0

¿Quiere decir 2 * s en el primer ejemplo? –

+0

Muy claro. Buen post. Solo estaba buscando por qué podría cambiar un 'const char * ptr' como argumento de entrada, y esto se aclaró perfectamente. Estoy fuera de votación por otros 40 minutos, así que voy a ++ después de eso. – stevieb

0

Todos estos son válidos, la única línea problemática es char * c6 = "abc";: aquí "abc" es un literal const así que asignarlo a un puntero no const no es seguro, y al menos generar una advertencia si no es un error de compilación (No intenté compilarlo).