2011-01-30 13 views
13

Tengo una función main que tiene un char, que estoy tratando de pasar un puntero a que char en una función y tienen que cambiar desde A a B pero simplemente doesn Parece que no lo cambia. El ejemplo que se muestra aquí es solo el estado actual del código. Probé muchas variaciones diferentes sobre él, por lo que puede haber otros errores allí simplemente por agarrar pajitas.Tener una función de cambiar el valor de un puntero representa en C

int main() 
{ 
    char result = 'A'; 
    setChar(&result); 
    printf("%C", result); 
} 

void setChar(char* charToChange) 
{ 
    charToChange = "B"; 
} 
+0

Utilice las funciones de formato proporcionadas por [Reducción] (http://stackoverflow.com/editing-help) siempre que sea posible, especialmente para los fragmentos de código. La forma más fácil de hacerlo es formatear el código cuidadosamente en un editor externo, copiar y pegar a la pregunta, seleccionar el código y hacer clic en el botón '{}' en la parte superior del cuadro de edición. Esto inserta cuatro espacios al comienzo de cada línea. – RBerteig

+0

Un pensamiento más claro le hubiera permitido encontrar la respuesta usted mismo mucho más rápido. Los punteros no "representan" valores; ellos ** apuntan a ** valores (de ahí el nombre). Desea asignar el valor al que apunta el puntero. Obtiene el valor apuntado al desreferenciar el puntero. Quieres asignar un personaje. Usted especifica un personaje con comillas simples. –

+0

Gracias, entiendo el concepto muy bien, fue la sintaxis que fue el problema. – Nick

Respuesta

20

Lo que quiere es *charToChange = 'b';. El puntero charToChange es una variable local (parámetro) en setChar, pero puede cambiar lo que señala utilizando el operador de prefijo * y una asignación. Tenga en cuenta que *charToChange es un personaje, tampoco una cadena.

+1

Gracias, no creerías cuántas horas he tirado por ese pequeño *. Muy apreciado. – Nick

+1

@ Nick Quizás desee considerar obtener un mejor compilador. La mayoría de los compiladores dan una advertencia para los typecasts implícitos como este. – Lundin

9

Tiene que dereference el puntero pasado a setChar() para modificar el valor al que apunta, no el argumento del puntero.

También tiene que utilizar el carácter literal 'B' en lugar de la cadena literal "B" (que es un puntero a char, no un char).

void setChar(char* charToChange) 
{ 
    *charToChange = 'B'; 
} 
2

Necesitas eliminar la referencia de ella, y el literal debe haber un char en lugar de una cadena, es decir, apóstrofes uso en lugar de comillas dobles:

void setChar(char* charToChange) 
{ 
    *charToChange = 'B'; 
} 
3

Usted desea cambiar el valor el puntero a, no el puntero en sí.

lo tanto es necesario eliminar la referencia al puntero con *pointer:

void setChar(char* charToChange) { 
    *charToChange = 'B'; 
} 

Si no, que acaba de cambiar el valor local de charToChange.

8

cuando se llama a la función setChar con & resultado como parámetro, se pasa Dirección de resultado, donde se almacena.

lo que se asigna a char puntero * charToChange

Digamos Dirección de resultado es [0x00000010] -> 'A'

y dirección del charToChange se [0x00000100] -> 0x00000010

Ahora Cuando intenta escribir charToChange = "B";

crea nueva memoria donde almacena "B"

Digamos que [0x00001000] -> 'B' & & [0x00001001] -> '\ 0'

Así que mientras se hace la tarea almacena

[0x00000100] -> 0x00001000

Pero sin embargo, la Dirección 0x00000010 apunta a Un

Por lo tanto, es incorrecto

Debe reemplazar charToChange = "B "; a

* charToChange = 'B';

para que el valor en 0x00000100 convierte en 'B'

Recuerde siempre

* significa ValueAt Y

& Medios AddressOf

1

C copia punteros que se pasan ed en funciones como parámetros. Por lo tanto, dentro de la función que está manipulando una copia del puntero, , no el puntero en sí. Cuando sale de la función, el puntero si fue cambiado al igual que en

while (p++) if (*p = '\0') break; //example 

volverá a su valor anterior y será destruida la copia. El objeto de la ubicación de la memoria a la que apunta el puntero se puede cambiar y que es la idea detrás de pasar por referencia. Un error común es intentar anular un puntero dentro de una función y luego descubriendo que no es nulo al regresar de la función. En algunos sistemas, recupera el puntero apuntando a la basura o ubicaciones de memoria defectuosas que bloquean su programa cuando intenta leer o escribir en la variable.

void f(char* s) 
{ 
    /* code stuff */ 
... 
s = NULL; 
... 
return; 
} 

al regresar de f ahora s =? (valor anterior, NULL o GARBAGE) Esto ocurre con mayor frecuencia con variables pasadas a funciones definidas en módulos separados que toman valores por referencia o en contextos de ejecución (como subprocesos o memoria compartida entre procesos).

Cuestiones relacionadas