2012-07-09 23 views
6

Soy nuevo con toda la programación C y tengo una pregunta,cómo duplicar puntero para señalar en el mismo objeto

Si tengo una estructura, por ejemplo - y estoy apuntando en él, Quiero crear un nuevo puntero para apuntar a los mismos datos, pero no para que los dos punteros apunten al mismo objeto. ¿cómo puedo hacer eso sin copiar cada campo en la estructura?

typedef struct 
{ 
int x; 
int y; 
int z; 
}mySTRUCT; 

mySTRUCT *a; 
mySTRUCT *b; 
a->x = 1; 
a->y = 2; 
a->z = 3; 

y ahora quiero B al punto en los mismos datos

b = *a 

no es correcta, y el compilador está gritando a mí

cualquier ayuda sería grande! gracias :)

Respuesta

10

Primero, su código es incorrecto. Crea un puntero llamado a, pero no crea nada para que apunte. No puede desreferenciarlo (con a->x) hasta que apunte a algo.

Una vez que realmente tiene algunas estructuras para sus punteros para indicar, a continuación, puede copiarlos por cesión:

myStruct a_referand = {0}; 
myStruct b_referand = {0}; 
myStruct *a = &a_referand; 
myStruct *b = &b_referand; 

a->x = 1; 
*b = *a; // copy the values of all members of a_referand to b_referand 
// now b->x is 1 
b->x = 2; 
// now b->x is 2 but a->x is still 1 
+0

¿por qué es * b = * a y no b = * a? No puedo entender la diferencia entre: b = a, * b = a, b = * a, * b = * a. ¿Puedo obtener una breve explicación por favor? – user1386966

+3

@ user1386966: 'a' y' b' son punteros. '* a' y' * b' son las cosas que señalan. Desea copiar la cosa señalada por 'a', a través de la cosa apuntada por' b'. Por lo tanto, escribe '* b = * a'. 'b = a' cambia el puntero' b' para tener el mismo valor que 'a', que es otra forma de decir el cambio' b' para apuntar a lo mismo que 'a' apunta. 'b = * a' y' * b = a' no tienen sentido, porque no se puede hacer que una estructura sea igual a un puntero. –

+1

Mi analogía habitual, por cierto, es que un puntero es como una hoja de papel con una dirección escrita en ella. Lo que señala (también conocido como "referand") es como un edificio. No confundirías un edificio ('* b)' con algo que tenga la dirección del edificio escrita en él ('b'). '* b = * a' significa" construir un edificio en la dirección en 'b', y hacerlo igual al edificio cuya dirección está en' a' ". 'b = a' significa" copiar la dirección escrita en 'a' a' b' ". La analogía se debilita ligeramente cuando observa que en C puede tomar un puntero a 'a'; incluso los trozos de papel pueden tener sus propias direcciones en C. –

1

La función memcpy() copia un bloque de datos de una ubicación a otra. Para adaptarse a su pregunta, realizaría:

memcpy(b, a, sizeof(*b)); 
+1

-1 no usan 'memcpy' cuando se puede asignar a los objetos con' * b = * a'. –

Cuestiones relacionadas