Domanda

Diciamo che ho chiamato alcune indicazioni:

char * pChar;
int * pInt;

Lo so che entrambi sostengono semplicemente indirizzi di memoria che fanno riferimento a qualche altra posizione, e che i tipi dichiaro quanto è grande la posizione di memoria è puntato dal particolare puntatore. Così, per esempio, un char potrebbe essere la dimensione di un byte su un sistema, mentre un int può essere di 4 byte .. Così quando lo faccio:

pChar++; // I am actually incrementing the address pointed to by pChar by 1 byte;
pInt++; // I am actually incrementing the address pointed to by pInt by 4 bytes;

Ma cosa succede se faccio questo:

pChar+2; // increment the address pointed to by pChar by 2 bytes?
pInt+2; // increment the address pointed to by pInt by 2 bytes? what happens to the other two bytes?

Grazie .. Gradirei qualsiasi chiarimento qui .. è il tipo di puntatore semplicemente per l'operazione ++?

EDIT: Così avp risposto alla mia domanda opportunamente, ma ho una domanda di follow-up, che cosa succede quando faccio:

memcpy(pChar,pInt,2);

Sarà copiare 2 byte? o 4 byte? Avrò una violazione di accesso?

EDIT: La risposta, secondo Ryan Fox, è di 2 byte, perché sono typecasted a un (void *). Grazie! CHIUSO!

EDIT: solo così che i ricercatori futuri possono trovare questo .. Un altro pezzo di informazioni che ho scoperto ..

memcpy(pChar+5,pInt+5,2);

pretende molto di copia 2 byte del blocco di memoria puntata da mezzo litro + 5bytelocations, a PChar + 5bytelocations .. quello che succede è che 2 byte vengono copiati PChar + 5bytelocations da pInt (4 * 5) bytelocations .. non c'è da meravigliarsi ho ottenuto violazioni di accesso, stavo cercando di leggere da qualche parte io non dovevo essere la lettura ..:)

È stato utile?

Soluzione

"++" è solo un altro nome per X = X + 1;

Per i puntatori non importa se si incrementa di 1 o di N. In ogni caso, * N viene usato sizeof (tipo). Nel caso di 1 sarà solo sizeof (tipo).

Quindi, quando si incrementa da 2 (il secondo caso):
per char è 2 * sizeof (char) = 2 * 1 = 2 byte,
per int sarà 2 * sizeof (int) = 2 * 4 = 8 byte.

Altri suggerimenti

Ahh, ora ho capito. Si dovrebbe avere chiesto - "Qual è il punto di puntatori con tipi"

Ci sono due punti, in realtà:

  • Pointer aritmetica;
  • Dereferenziare (ottenendo la schiena valore memorizzato nell'indirizzo che il puntatore sta puntando).

Entrambi sarebbe impossibile senza conoscere il tipo di puntatore.

Aggiunto: Leggi la documentazione di memcpy. L'ultimo argomento è il numero di byte, perché memcpy ha idea di cosa il tipo del puntatore è. Entrambi gli argomenti ad esso sono puntatori void.

Aggiunto 2: Violazione di accesso - dipende. Se non si ha intenzione di fuori della memoria che avete assegnato per questi puntatori, non ci sarà violazione di accesso. L'operazione di copia copierà tutto byte per byte e si ottengono i risultati proprio come te lo aspetti (anche se potrebbe non avere molto senso).

Se avete intenzione di fuori i vostri limiti di memoria allocata allora si potrebbe ottenere una violazione di accesso, ma si potrebbe anche solo attraversare nella memoria che è stato assegnato per un'altra variabile. E 'praticamente impossibile dire che cosa ottiene dove quando viene eseguito il programma, in modo da fare questo porterà a risultati abbastanza imprevedibile.


Ci sono tre vantaggi principali di puntatori:

  1. È possibile passare gli argomenti a funzionare "per riferimento". Questo usato per essere più di un problema in C, che non hanno riferimenti reali come C ++, ma è ancora molto utile in molti casi, come quando si deve cooperare con librerie esterne. Si noti inoltre, che il passaggio per riferimento non è utile solo quando si desidera che la funzione di modificare la variabile che si sta passando. E 'anche molto buono per il passaggio di grandi strutture di dati come parametri.
  2. Per la costruzione di tutti i tipi di strutture dati dinamiche nifty come alberi, liste collegate, ecc questo sarebbe impossibile senza puntatori.
  3. Per poter riassegnare array a più grandi / piccole come necessario.

P.S. Capisco che la questione era di circa il motivo per cui i puntatori sono buone, utilizzando i aritmetica solo come esempio, giusto?

L'aritmetica dei puntatori non funziona esattamente così. Il tuo primo esempio è corretta, la seconda non tanto.

pChar+2; // increment the address pointed to by pChar by 2 bytes
pInt+2; // increment the address pointed to by pInt by 8 bytes

Per questa parte:

  

memcpy (PChar + 5, Pinta + 5,2);

In primo luogo, "+" viene valutata, quindi, typecast.

Quindi, in byte:

PChar + 5 qui "5" è di 5 byte,
pInt + 5 qui "5" è di 5 interi, quindi 5 * 4 = 20 byte.
Poi tutto è gettato a void * e due byte copiati.

Se invece di "5" si utilizza contatore, come qui:

for (int i = 0; i<100; i++)
    memcpy(pChar+i, pInt+i, 2);

Poi per PChar verrà sovrascrivere un byte copiati (il secondo) con il comando copia successiva. E per pInt sarai saltando 4 byte ogni passo (che è ok per array di int però).

avrei detto che il punto di tipi di puntatore in C ++ è quello di tenere conto di offset vtable.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top