2010-11-01 22 views
5

Questo è probabilmente semplice, ma sto cercando di capire meglio i puntatori. Diciamo che ho una structC++ domanda puntatore da sforzo

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

e permette di dire che ho un po 'di questi memorizzato nella memoria come uno dopo l'altro. quindi ora dichiaro un nuovo puntatore alla struct.

struct Person *ptr; 

Sarà questo puntatore inizio all'ingresso FIRST? (aka il primo "Nome") e quando lo iterate (aka ptr ++) andrà alla prossima STRUCT o alla successiva "voce" alias nome -> ID ---> Indirizzo

Quindi diciamo Im sulla prima voce per esempio ei dati sono:

Jason Adams 
111222333 
111 Fake Drive 
55555551000 

e la seconda voce è

Matt Johns 
111555333 
555 Derp lane 
1000022434 

ora iterare il ptr (ptr ++) sarà il punto ptr alla seconda struct (quello con opaco johns) o indicherà "ID" di Jason Adams

Spero che abbia senso?

risposta

5

Punterà alla seconda struttura. Il puntatore verrà avanzato da sizeof(Person).

+0

Oh quindi se volessi passare alla voce successiva userò ptr + sizeof (Person)? o "sa" di andare alla seconda struttura quando si usa semplicemente ptr ++ –

+1

No. Ogni volta che si aggiunge un valore integrale a un puntatore si moltiplica implicitamente il valore per 'sizeof ()'. Se aggiungi 1 a un puntatore (sia per 'ptr ++' o 'ptr + n'), avanza implicitamente" uno degli elementi puntati. " Se hai aggiunto 'sizeof (Person)' a un 'Person *', avanzava più di una voce. –

+0

OH, grazie, grazie. questo è quello che pensavo fosse ma non era sicuro al 100%. –

2

Come detto da John, sarà anticipato dalla dimensione di se stesso, ovvero sizeof (Persona).

La manipolazione del puntatore è comunque divertente e puoi eseguire operazioni come lanciare il puntatore su un tipo diverso. Una volta fatto ciò, l'aritmetica del puntatore avanzerà della dimensione sottostante del tipo. Comunemente vedrai puntatori convertiti in (byte *) o (char unsigned *) per consentire l'accesso di singoli byte ai dati sottostanti.

+0

Interessante, diciamo che volevi far avanzare il ptr per indicare "ID" di Jason Adams (non so perché vorresti) ma solo per curiosità come faresti a farlo? –

+0

Non è possibile legalmente fare ciò e avere ancora un puntatore a una Persona, perché 'char [15]' non è lo stesso tipo di 'Persona'. –

+0

Quindi cosa intendeva quando ha detto "lancia un puntatore a un tipo diverso", scusami non sono il migliore con i puntatori :( –

0

Prima di tutto, è necessario allocare memoria per il puntatore ptr prima di utilizzarlo.

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

Successivamente, è possibile provare il codice riportato di seguito.

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. 

ti ha chiesto come accedere attributo ID incrementando ptr.

Come illustrato sopra, è possibile accedere al membro ID della struttura.

+0

Non dovresti usare "auto_ptr', è deprecato in C++ 0x. –

+0

@Adam: Si lo so.Ma OP taggato come C++ – bjskishore123