2010-11-01 11 views
5

Esto es probablemente simple, pero intento intentar entender mejor los punteros. Digamos que tengo una estructuraC++ Pregunta de puntero de estructura

struct Person{ 
    char Name[20]; 
    char ID[15]; 
    char Address[50]; 
    char Number[15]; 
}; 

y Digamos que tengo un montón de ellos almacenados en la memoria como uno después del otro. así que ahora declaro un nuevo puntero a la estructura.

struct Person *ptr; 

¿Comenzará este puntero en la PRIMERA entrada? (también conocido como el primer "Nombre") y cuando lo itere (también conocido como ptr ++) irá al próximo STRUCT o al siguiente "ingreso" también conocido como nombre -> ID ---> Dirección

Así que digamos Im en la primera entrada, por ejemplo, y los datos es:

Jason Adams 
111222333 
111 Fake Drive 
55555551000 

y la segunda entrada es

Matt Johns 
111555333 
555 Derp lane 
1000022434 

ahora iterar el ptr (ptr ++) será el punto ptr a segunda struct (el uno con mate Johns) o señalará a Jason Adams "ID"

Espero que esto tenga sentido?

Respuesta

5

Apuntará a la segunda estructura. El puntero se avanzará por sizeof(Person).

+0

Oh, si yo quisiera llegar a la próxima entrada, usaría ptr + sizeof (Person)? o "sabe" ir a la segunda estructura cuando solo usa ptr ++ –

+1

No. Cada vez que agrega un valor integral a un puntero, implícitamente multiplica el valor por 'sizeof ()'. Si agrega 1 a un puntero (ya sea por 'ptr ++' o 'ptr + n'), avanza implícitamente '' uno de los elementos apuntados ''. Si agrega 'sizeof (Person)' a 'Person *', avanzaría mucho más de una entrada. –

+0

OH gotcha, gracias. eso es lo que pensé que era pero no estaba 100% seguro. –

2

Como mencionó John, se adelantará por su tamaño, también conocido como sizeof (Persona).

La manipulación de punteros es divertida, sin embargo, y puede hacer cosas como colocar el puntero en un tipo diferente. Una vez que lo haga, la aritmética del puntero avanzará según el tamaño subyacente del tipo. Comúnmente verá los punteros convertidos a (byte *) o (char sin signo *) para permitir el acceso de bytes individuales a los datos subyacentes.

+0

Interesante, bueno, digamos que querías avanzar al ptr para apuntar a la "ID" de Jason Adams (no sé por qué querrías) pero solo por curiosidad, ¿cómo harías para eso? –

+0

No puede hacer eso legalmente y aún tener un puntero a una Persona, porque 'char [15]' no es del mismo tipo que 'Persona'. –

+0

Entonces, ¿qué quiso decir cuando dijo "lanzar un puntero a un tipo diferente", lo siento, no es el mejor con punteros :( –

0

Antes que nada, debe asignar memoria a su puntero ptr antes de usarlo.

auto_ptr<Person> ptr(new Person); //auto_ptr for automatic freeing 

Después de eso, puede intentar a continuación el código.

strcpy(ptr->ID, "100"); //For illustraction 
int offset = ptr->ID - ptr->Name; //Get offset of ID member 
char *pID = ((char *)ptr.get())+ offset; 
//Typecast to char pointer and increment by offset to get to ID field 
cout<<pID; //Now pId can be used to access ID. 

Ha preguntado cómo acceder al atributo ID al incrementar ptr.

Como se muestra arriba, puede acceder al miembro de la estructura.

+0

No debe usar 'auto_ptr', está en desuso en C++ 0x. –

+0

@Adam: ya sé.Pero OP etiquetado como C++ – bjskishore123

Cuestiones relacionadas