I puntatori C ++. parte 2





указатели с++, C ++ puntatori

il parte abbiamo preso in considerazione, come si utilizza un operatore di puntatore nuovo pezzo può essere identificato direttamente nel formato richiesto durante il programma. appena appreso, come questo pezzo di memoria può essere liberata, utilizzando cancellare. Abbiamo visto come i parametri sono trasferiti alla funzione puntatore. e, rende possibile modificare il valore delle variabili, che sono passati alla funzione.

Ora guardiamo un esempio in cui si passa alla funzione un puntatore a una stringa (Indici come carbonizzare). Questa funzione restituisce un puntatore a sé. Il compito seguente: Ci sono due puntatori a stringhe, in cui essi sono allocati le aree di memoria necessarie. È necessario combinare queste due linee. Cioè, è necessario allocare un nuovo pezzo di memoria per la prima riga, per rendere possibile aggiungere ad esso una seconda linea.

prima, Come digitare il codice, che non si è “sepolto” errori – installare l'ultima versione di Microsoft Visual Studio ambiente. Например Microsoft Visual Studio 2013 Esprimere. Se si utilizza una versione precedente, invece funzioni strcat_s() applicare strcat() e strcpy() invece di strcpy_s().

Andiamo in ordine. on line 4 Si tratta di un prototipo di funzione. la sua missione – allocare un nuovo pezzo di memoria per la stringa, al termine del quale è inserito una riga differente. Ciò sarà discusso in seguito, quando si arriva alla definizione di questa funzione,. Vai alla linea 11 – 12. Essi definiscono le variabili, che memorizzerà i valori delle lunghezze delle stringhe "fila 1 " e "+ fila 2". La lunghezza viene calcolata con l'ausilio di funzioni built-in strlen(). Esso restituisce la lunghezza della stringa, escluso il simbolo \0 . Pertanto, quando l'inizializzazione delle variabili strsize1 e strsize2 a questo aggiungiamo che il ritorno strlen(…) edïnïcw.

on line 14 puntatore definito pStr1 la prima riga. Per scrivere una stringa, è necessario prima selezionarlo dalla memoria: carbonizzare* pStr1 = nuovo carbonizzare[strsize1]; La seguente copiare una stringa nella memoria allocata: strcpy_s(pStr1, strsize1, "fila 1 "); . Il primo parametro, che funzione riceve strcpy_s() – un puntatore per l'indirizzo dove si desidera copiare una stringa; secondo – dimensioni fila; terzo – la stringa stessa. Il secondo indicatore pStr2 Definiamo esattamente.

la pagina. 20 – 21, si prega di mostrare sullo schermo la linea registrata. È sufficiente fare riferimento a loro con segni di nomi. Puntatore memorizza la cellula nullo indirizzo. Quando chiediamo di mostrare sullo schermo – verrà visualizzato alternativamente un array di caratteri (area di memoria, precedentemente isolato), fino a quando un carattere di nuova riga – \0 .

pp. 23-24 – guardare il numero di byte di memoria prende ogni riga. fila 26 cancellato un commento. Si fatto un tentativo di aggiungere una seconda linea nel primo. Provare a rimuovere // e compilare il programma. L'attuazione del programma si interrompe errore. Si vedrà la seguente schermata:

указатели на строки с++, puntatori alla linea C ++, nuovo, cancellarenaturalmente – perché l'area di memoria allocata sotto la prima linea è troppo piccola, per finire ha tutti i dati. on line 28 scrivere variabile RequiredSize veramente la dimensione della memoria necessaria per registrare due linee: int RequiredSize = (strsize1 + strsize2) - 1; sottrarre Unità perché, variabili strsize1 e strsize2 già incluso Due \0 , e abbiamo bisogno di un solo.

Passare alla definizione di giveNewMem() – pp. 42 – 51. Ci vorrà la prima linea (un puntatore ad esso) e intero (una quantità sufficiente di memoria). vedere – abbiamo bisogno di allocare un nuovo pezzo di memoria in questa funzione per la scrittura di caratteri in esso. Quindi la funzione deve restituire un puntatore alla nuova posizione di memoria. Quindi possiamo scrivere all'indice pStr1 nuovo indirizzo, in cui la memoria è di scrivere due righe. Pertanto, nell'intestazione della funzione scrivere così carbonizzare* giveNewMem(carbonizzare *pstr1, int reqSize)

Poiché il nuovo blocco di memoria è evidenziato, allora la memoria, che occupa la prima linea dovrebbe essere rilasciato. Se facciamo questo proprio all'inizio della funzione – dati (linea di caratteri) scomparire, perché perdiamo l'indirizzo al quale si trovano. Pertanto, dovremmo essere in una funzione per richiedere un nuovo pezzo di memoria, in cui copiare i simboli della prima riga, prima che la memoria vacate.

Creare una nuova directory e assegnare immediatamente la memoria per esso, abbastanza per ospitare due file di simboli (pp. 44). Quindi copiare la memoria selezionata nella prima riga di caratteri: strcpy_s(strInFunc, reqSize, pstr1); String skopirovana – è necessario liberare memoria, ha tenuto, non vi sia una perdita di memoria (pp. 48). Torniamo da un puntatore a funzione nella nuova posizione di memoria: ritorno strInFunc;

Si scopre, quando chiamiamo questa funzione da principale() (pp. 31) pStr1 = giveNewMem(pStr1, RequiredSize); – indicizzati pStr1 indirizzo scritto della nuova sezione di memoria, che è in grado di ospitare due linee. Resta solo da aggiungere nella seconda riga della Memoria (pp. 33) e mostrare sullo schermo. Prima di uscire dal programma libera la memoria. La prima che è stata allocata nella funzione, quindi è qui che la seconda riga.

compilare il programma:

указатели на строки с++, puntatori alla linea C ++, nuovo, cancellare

Questo esempio ha dimostrato, noi, usando puntatori, Siamo in grado di disporre di RAM, fino a byte.

Alla fine riassumere e scrivere di base, è necessario ricordare a proposito puntatori.

Perché puntatori in C ++?

  • usando puntatori, possibile dotazione di memoria dinamica. Poiché memoria per i dati viene rilasciato nel corso del programma di lavoro, piuttosto che in fase di compilazione. Questo è molto vantaggioso, quando non sappiamo in anticipo rispetto al programma sarà utilizzato come dati reali (variabili). Per allocare la memoria ed è gratuito, utilizzato dagli operatori nuovo e cancellare.
  • Gli indici sono spesso utilizzati per accedere a porzioni del volume di dati delle funzioni. Dati matrici simboliche e numeriche tale, che sono definite all'esterno della funzione. Questo approccio è venuto dal linguaggio di programmazione C. In C ++, variabili numeriche relative matrici e più facile da usare trasmissione collegamento. Presto, vedremo questo argomento. Per quanto riguarda le linee di C-stile è meglio applicare per il trasferimento del segno.
  • usando puntatori – lavoriamo con la memoria agli indirizzi direttamente. E 'più veloce, che andare con il nome di variabili.

dichiarare puntatori, prendendo indirizzi, dereference

Si consideri l'esempio in dettaglio:

on line 8 variabile intera regolare definita. on line 9 commentata dichiarare e inizializzare il puntatore. Provare a rimuovere il commento segni // e compilare. Noi segnalare un errore. bene. Dovrebbe essere un puntatore per memorizzare l'indirizzo (numero esadecimale), non il valore (numero decimale o il simbolo). a, per ottenere l'indirizzo di una variabile utilizzata dagli indirizzi operazione di cattura & (E commerciale: Spostamento + 7). on line 10 creare indice e scrive l'indirizzo della variabile:

инициализация указателя

Per determinare l'indice, Dobbiamo dichiarare il suo tipo, per il tipo di un asterisco * e dargli un nome. Inizializzare il puntatore non può che affrontare. Se non si assegna un puntatore di indirizzo nella sua dichiarazione, Inizializzare a zero. Poi un puntatore può portare a errori complessi, che è difficile da trovare. Ha appena tutto ciò che non indicherà.

Di solito non siamo particolarmente interessati, che memorizza un puntatore indirizzo. Siamo interessati a dati, situato a questo indirizzo. Per vedere queste informazioni (o modificarli) Puntatore al nome dell'operazione, è necessario applicare il dereference. Questa è la stessa stella *, nonché la dichiarazione.

puntatore dereference

Cout flusso solo viene trattata in modo diverso – non tanto quanto nella dichiarazione cursore. Aiuta a accedere ai dati, memorizzato all'indirizzo. Questo è mostrato nella riga 15 fonte.

on line 18 certo tselochislennыy schieramento cinque elementi. Sotto puntatore specificato. Si prega di notare – inizializzare un puntatore alla matrice indirizzo, operazione & non applicabile. Questo perché, che il nome della matrice si riferisce all'indirizzo della cuvetta zero. Si scopre che il record

inizializzazione puntatore

abbastanza normalmente compilato. La variabile puntatore pFirstArr indirizzo verrà registrato cella di matrice pari a zero firstArr. Questa voce è simile al seguente

inizializzazione puntatore

on line 25 mostra un esempio di accesso elementi di dati nella matrice tramite un puntatore. Utilizzare notazione di matrice. Cioè, non abbiamo bisogno di applicare l'operazione dereference, per accedere alla matrice di dati:

cout << "pfirstArr[0] = " << pFirstArr[0] << endl << endl;

lattina, naturalmente accedere alla matrice di dati, Utilizzando la notazione dei puntatori, ma è scomodo. guardare, sembrava come se l'assegnazione dei valori degli elementi dell'array e visualizzare i valori sullo schermo:

linee 27 – 28 fonte – definizione Si-stroki e determinazione su questo puntatore linea. I puntatori sono molto bravo a lavorare con le stringhe. Quando siamo nella chiamata flusso cout per nome per un puntatore a un array di caratteri, Egli ci mostrerà l'intera linea. Come nel caso di array, il compilatore visualizzare i caratteri sullo schermo, fino a trovare la fine della stringa nel simbolo matrice \0

Guardare l'esito del programma e il codice sorgente di nuovo. Cercate di capire come funziona.

inizializzazione puntatore, puntatore dereference, & prendendo indirizzi

un'altra digressione, per incoraggiare coloro, che è dato difficili argomento puntatori :) Tu non sei solo. Tutto viene con la pratica! E si tratta di voi! Non agitarti, se sembra troppo confusa per voi. Risolvere il maggior numero possibile attività di programmazione. Anche se fai qualcosa che si fa, non nel processo di scrittura di codice, il nostro ambiente di sviluppo meraviglioso saprà su di esso.

Assicuratevi di guardare il video di marcatori (con 12 minuti di), se non avete visto nella prima parte di questo articolo:

puntatori, come parametri (argomenti) funzione:




Newsletter nuove lezioni sulla programmazione:

I puntatori C ++. parte 2
4.5 (90%) 4 voti

9 pensieri su "I puntatori C ++. parte 2

  1. Non riesco a capire , in 15 linea di codice – strcpy_s(pStr1, strsize1, “fila 1 “);
    funzione viene utilizzata in strcpy_s 3 argomento, precedenza nella descrizione di questa funzione, indica unicamente 2 argomento (dove la copia e che la copia).
    In realtà la domanda : perché è ora 3 argomento? Poiché stiamo usando un puntatore come primo argomento? O perché è una nuova versione di questa funzionalità (strcpy_s вместо strcpy)? O questa funzione Visual Studio? inutilmente. codice в:: blocca la funzione strcpy prende 2 argomento <>.

    1. Il codice utilizzato strcpy_s funzione di esempio(), invece di strcpy(), che in realtà 2 argomento. Vedere i nomi con attenzione.

      P.S. Questo non significa, in modo che dovrebbe essere fatto: strcpy_s() – funzione, non incluso in ogni standard POSIX, ни C, o Linux, ecc. etc. … e viene utilizzato solo su sistemi operativi Windows (non hanno nemmeno trovato la sua descrizione nella letteratura). Ma questo particolare esempio – corretto.

      1. Ho avuto solo quello che non trovo la descrizione di strcpy_s, E perché questa funzione, è necessario conoscere la dimensione della stringa non è chiaro.
        dimensione di riga è necessario sapere perché il primo argomento un puntatore? O è una caratteristica delle funzioni aggiornate? E quanti argomenti di questa funzione richiede generalmente (può assumere) ?

    2. Specificare la dimensione della stringa copiata è molto utile: se l'origine riga, per caso, purché il ricevitore, si riceverà un errore di accesso alla memoria, con il crollo dell'intera applicazione.

      Vedere la descrizione delle funzioni della libreria standard e strncpy(), che è più sicuro e sempre più utilizzato in codice professionale di strcpy().

  2. L'ambiente di sviluppo DEV CPP 5.11.
    Il primo esempio funziona senza perevydeleniya funzione di memoria :)

  3. “La stringa viene copiata - è necessario liberare memoria, ha tenuto, non vi sia una perdita di memoria (pp. 48).”
    48:cancellare [] pstr1; // libera la memoria pstr1
    puntatore pstr1 ancora immediatamente sovrascritto
    31:pStr1 = giveNewMem(pStr1, RequiredSize);
    Normalmente Compilare ed eseguito senza riga 48.

Lascia un Commento

L'indirizzo email non verrà pubblicato. i campi richiesti sono contrassegnati *