2011-01-28 17 views
5

en este código:cambiar el contenido de un puntero variables

#include <iostream> 
int main() 
{ 
const char* name = "Abc"; 
std::cout<<*name<<std::endl; 
return 0; 
} 

Cómo se puede cambiar el contenido de la variable de puntero, no a lo que está apuntando a?

Y, ¿por qué solo obtengo A como resultado de este programa?

Gracias.

Respuesta

11

usted consigue una char porque estás desindexación un puntero char*.

podría cambiar el contenido haciendo:

*a = 'B'; // your char* would contain "Bbc" 
a[0] = 'B'; // your char* would contain "Bbc" 
a[1] = 'B'; // your char* would contain "ABc" 
a[2] = 'B'; // your char* would contain "AbB" 

embargo, cambiar el contenido de una cadena literal tiene un comportamiento indefinido en C. Entonces no deberías hacer eso. En su lugar, debe completar su char* dinámicamente. Con algo como esto:

char *a; 
a = malloc(sizeof(char)*100); // a string with a maximum of 99 chars 
strcpy(a, "Abc"); 
// now you can safely change char* contents: 
a[0] = '1'; 
a[1] = '1'; 
a[2] = '1'; 
printf("%s", a); // will print 111 

manipulación de cadenas no es tan fácil en lenguajes como C . Dado que por la sintaxis que está utilizando, parece que está compilando su código con un compilador C++, entonces puede probar la clase string en lugar de usar punteros a char para manejar sus cadenas.

1

Usted está accediendo a *Name que se refiere a la primera posición de la memoria que tiene una Yo quiero fyou impresión B *(Name+1) y etc ..

Si desea cambiar el contenido a continuación, asignar el valor a * Nombre o * (Nombre + 1) o donde quieras.

+0

Tenga cuidado: cambiar los literales de las cadenas es un comportamiento indefinido - son const por una muy buena razón – Flexo

4

No intente cambiar el contenido de una variable const char *. Por definición, es constante. Si desea una cadena mutable, use std :: string o asigne un búfer char * [] en su lugar.

1

para cambiar el valor de la dirección de name puede cambiar a la dirección de otra cadena literal:

const char* newname = "def"; 
name = newname; 

tal que el nombre sigue siendo un puntero a const char.

0

Debe comprender const con respecto a los punteros.

const char * significa un puntero a datos que no puede modificar, pero puede mover el puntero.

const char * name = "Abc"; 
name = "Def"; // allowed 
name[1]='B'; // compiler error 

Si desea un puntero no se puede mover a continuación, utilizar

const char * const name = "Abc"; // cannot move to point at something else 
char data[] = "ghi"; 
char * const name = &data[0]; 
name[1] = 'H'; // permitted 
name = &data[1]; // not allowed as name is a constant pointer 

Su salida es una causa * nombre es un char, el que su puntero apunta, por tanto, el primero en la cadena.

Cuestiones relacionadas