I puntatori C ++. parte 1





указатели с++, указатели c++, new delete c++

La raccolta di informazioni per questo articolo, Mi sono ricordato il mio primo incontro con i puntatori – tristezza tristezza era… Pertanto, dopo aver letto alcuni capitoli sul tema da diversi libri sulla programmazione in C ++, si è deciso di andare un altro modo e presentare i puntatori argomento C ++ nella sequenza, che ritengo necessario. Basta dare una breve definizione e prendere in considerazione i segni in – Esempi. Nel prossimo articolo (I puntatori C ++. parte 2) Si metteranno le sfumature, con l'uso di puntatori professionisti in Si stile (array di caratteri) e di base, che dovremmo ricordare.

Pointer in C ++ – variabile, che memorizza l'indirizzo di un dato (senso) in-memory, e non i dati.

Si consideri il seguente esempio, si capirà il principale – Perché abbiamo bisogno di programmare indicatori, come dichiarare e l'uso.

Diamo, nel programma abbiamo bisogno di creare un array di interi, la dimensione esatta di che non ci è noto prima dell'inizio del programma. Cioè, non sappiamo quanti numeri che l'utente dovrà fare in questo array. naturalmente, siamo in grado di assicurare e dichiarare un array di diverse migliaia di articoli (ad esempio su 5 000). esso (Nella nostra opinione personale) Dovrebbe essere sufficiente per l'utente lavori. che – davvero – Questo può essere sufficiente. Ma non dimentichiamo, che l'array avrà molto spazio nella RAM (5 000 * 4 (тип int) = 20 000 byte). Abbiamo poi sbagliamo, e l'utente riempirà solo 10 elementi della nostra gamma. Si scopre, che in realtà 40 byte in, e 19 960 BYTE inutilmente prendere la memoria.

La funzione di libreria standard taglia di() inviare un annuncio alla matrice arrWithDigits fila 10. Si tornerà al luogo di dimensioni chiamata in byte, che prende la matrice nella memoria. chiesto “Quanti numeri si entra in un array?” rispondere – 10. on line 15, espressione quantità * taglia di(int) sarebbe equivalente a 10 * 4, poiché la funzione taglia di(int) ritorno 4 (nella dimensione di byte int). Avanti, inserire il numero dalla tastiera e il programma li mostrerà sullo schermo. Si scopre, che il rimanente 4990 Elementi non mancherà di tenere gli zeri. Quindi non ha senso per mostrare loro.

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

Home Info sullo schermo: Massa ha preso 20 000 byte, ma in realtà è necessario 40 byte. Come uscire da questa situazione,? forse, qualcuno vuole riscrivere il programma in modo, all'utente l'input della tastiera della matrice, e dopo aver inserito un valore di dichiarare un array con il numero di elementi. Ma ciò non può essere realizzato senza puntatori. Come ricorderete – dimensione della matrice deve essere una costante. Per esempio integer costante deve essere inizializzato a una dichiarazione di matrice e non possiamo chiedere per lei input dalla tastiera. esperimento – controllare.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

указатели с++, указатели c++, new, delete
Qui si metterà in evidenza operatore in rosso >> dal momento che non è possibile modificare il valore costante.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

указатели с++, указатели c++, new, delete
Qui siamo avvertiti, che la dimensione di matrice non è un valore può essere una variabile normale. È necessario un valore costante!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Nel prossimo esempio useremo un puntatore e nuovi operatori per voi nuovo (allocare memoria) e cancellare (libera la memoria).

L'utente immette un valore con la tastiera – fila 12. Qui di seguito un determinato indice: int* arrWithDigits Questa voce significa, che arrWithDigits – un puntatore. È stato progettato per memorizzare gli indirizzi di cella, che sarà un numero intero. In questo caso, arrWithDigits punterà a una matrice di celle di indice 0. contrassegno * – la stessa che viene utilizzata per la moltiplicazione. compilatore contestuale “capirà”, è indice classificato, non moltiplicare. Seguita dal segno = e l'operatore nuovo, che assegna locazione di memoria. ricordiamo, che la nostra memoria deve essere allocata per la matrice, piuttosto che con un unico numero. record nuovo int [sizeOfArray] in modo da poter decifrare: nuovo (allocare memoria) int (interi bagagli) [sizeOfArray] (nella quantità di sizeOfArray).

Così in fila 16 E 'stato identificato array dinamico. Questo significa, che la memoria viene allocata per esso (o stare fuori) durante il programma, piuttosto che al momento della compilazione, come è il caso con le matrici convenzionali. Cioè, l'allocazione di memoria dipende dallo sviluppo di programmi e soluzioni, sono presi direttamente al suo lavoro. In questo caso, – Dipende, che introdurrà l'utente alla variabile sizeOfArray

on line 25 l'operatore applica cancellare. Si rilascia l'operatore selezionato nuovo memoria. da nuovo Esso alloca memoria per un array di alloggio, anche se la sua uscita è necessario rendere chiaro al compilatore, è necessario rilasciare la memoria di matrice, e non solo la cuvetta zero, che indica arrWithDigits. Pertanto, tra cancellare e il nome dell'indice messo tra parentesi quadre [] – cancellare [] arrWithDigits; Tenete a mente, che ogni volta, Quando la memoria viene allocata da un nuovo, è necessario rilasciare questa memoria utilizzando cancellare. naturalmente, al termine di memoria di programma, occuparono, Esso sarà automaticamente liberato. Ma lasciate per diventerai una buona abitudine di usare gli operatori nuovo e cancellare a coppie. Dopo tutto, il programma può essere localizzato 5-6 es array. E se si vuole liberare la memoria, ogni volta, quando non è più necessaria in futuro nel programma in esecuzione – la memoria sarà speso in modo più saggio.

Supponiamo che nel nostro programma abbiamo riempito l'array con dieci valori. Avanti, trovarli, e l'ammontare registrato in qualche variabile. e tutto – Più lavoriamo con l'array non sarà più. Il programma continua anche a lavorare e nuovi array dinamici sono in esso per qualsiasi scopo. In questo caso, si consiglia di liberare la memoria, che occupa il primo array. Poi, quando l'allocazione di memoria per il resto di questo matrici di memoria può essere usato per riprogrammare.

Prendere in considerazione l'uso di puntatori, come parametro funzione. per un avvio, entrare e compilare il seguente codice. Si ottiene una funzione di due variabili, e propone cambiamenti nella loro valori.

Eseguire il programma e inserire i nuovi valori per le variabili. Si vedrà alla fine, Al completamento della funzione, le variabili non sono cambiate e sono 0.

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

Come ricorderete, funzione non direttamente con le variabili, e creare le loro repliche. Queste copie vengono distrutti dopo aver lasciato la funzione. Cioè la funzione ottenuta sotto forma di parametro alcune variabili, Ho creato una copia di esso, Ho lavorato con lei e distrutto. La variabile stessa rimane invariata in questo caso.

utilizzando i puntatori, possiamo passare agli indirizzi variabili della funzione. Poi la funzione sarà in grado di lavorare direttamente con variabili di dati a. cambiamento Vnesom al programma precedente.

il titolo (fila 27) e prototipi funzionali (fila 5), aggiungi il funzionamento * prima i nomi dei parametri. Questo suggerisce, tale funzione per ottenere l'indirizzo, piuttosto che i valori delle variabili. Quando si chiama una funzione della principale() aggiungere ai nomi di funzionamento variabili trasmesse & (E commerciale – Spostamento + 7). & Significa che assumono gli indirizzi. Ti ricordi, che memorizza un puntatore indirizzo. Pertanto, non possiamo passare il senso ordinario, se indicato nel titolo, che la funzione accetta un puntatore. utilizzando & prima che i nomi delle variabili, funzione di ottenere i loro indirizzi.

Il corpo della funzione, quando si immettono valori in variabili, è necessario utilizzare il puntatore dereference. Questo viene fatto usando tutte la stessa operazione * : gin >> *varForCh1; Quindi faremo cambiamenti nei valori delle variabili, piuttosto che l'indirizzo. Controllare il funzionamento del programma:

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

tutto girato – variabili sono state modificate in funzione.

tale metodo (passando parametri alla funzione tramite un puntatore) ampiamente utilizzato nella programmazione C. In C ++, si utilizzano sempre i parametri di trasmissione in funzione di collegamento. Non v'è alcuna necessità di utilizzare il dereference * e prendendo indirizzi & variabili. Pertanto, l'utilizzo passaggio per riferimento è più conveniente. Questo metodo ci guarderemo nelle seguenti lezioni.

Non si preoccupi, se qualcosa non è chiaro. Hai un sacco di nuove informazioni in questa lezione – ed è abbastanza normale, che non tutto è immediatamente fermato. puntatori comprensione verrà con la pratica. Parleremo di puntatori in la seconda parte di questo articolo e compito poreshat. Quindi, tutto andrà bene.

Se possibile, guardare il video su puntatori (con 12 minuti di):

parametri (argomenti) funzione:




Newsletter nuove lezioni sulla programmazione:

I puntatori C ++. parte 1
3.9 (78.18%) 11 voti

11 pensieri su "I puntatori C ++. parte 1

  1. A circa al 45 dell'8 ° lezione dice, che se non si utilizza la costante, allora per ogni memoria da allocare solo attraverso nuove. Ma, al momento, ho pensato,, che il caso è risolto un'altra variabile.
    int N;
    gin>>N;
    const int M = N;
    int d[M];

    per (int i = 0;io!= M;i ++)
    {
    d[io] = i;
    cout <<d[io]<<endl;
    }

    E questo ho compilato abbastanza.

    1. Non si poteva assegnare M = N, basta scrivere: int d[N].
      Ma questo non contraddice ciò che è stato detto nulla – esso estensione C ++ standard, è venuto dal linguaggio standard C99 C (come si può vedere, tutti questi standard sono gli anni più recenti!), e si chiama VLA (Variabile Array Legth).
      Questa estensione consente di creare locale alla funzione array con dinamicamente determina la dimensione. In questo caso, viene creata la matrice lo stack la funzione chiamata. fondamentalmente, in C è stata precedentemente nascosta modo di fare la stessa cosa chiamando:

      È necessario utilizzare il VLA, tuttavia, attentamente:
      – è compilato solo se si dispone di un compilatore opzione installata sui nuovi standard;
      – Questa innovazione è un sacco di polemiche, e può essere invertito in standard futuri.

      1. Grazie per le vostre spiegazioni dettagliate. Io parto dal presupposto M = N, perché, che l'autore del video ha mostrato, sia direttamente, se non si utilizza la parola chiave const, non compilato. Ho subito deciso di controllare, ma un po 'diverso. a proposito, compilatore per lungo tempo, ho fatto notare a ++ 11.

    2. Array prende la memoria, matrice dinamica funziona come un normale, Ora solo la memoria allora viene cancellata, in progetti di grandi dimensioni è molto utile

      1. E 'un'affermazione molto dubbia!
        Una serie di dichiarato localmente (nella funzione) È collocato nella pila e viene eliminato dalla fine della funzione. Soprattutto dopo la risoluzione è array in modo efficace con i confini dinamici C ++ standard di 11.
        E l'uso di array allocati dinamicamente, in determinate meriti, Essa ha anche più svantaggi.

  2. paradosso!!!
    compilatore “compilatore: GNU GCC Compiler” Ho adottato il seguente codice:

    #includere
    #includere

    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “russo”);

    int SizeOfArray;
    cout << "Сколько чисел вы введёте в массив? " <> SizeOfArray;
    arrWithDigits int[SizeOfArray] = {};

    per (int i = 0; io < SizeOfArray; i ++)
    {
    cout << io + 1 <> arrWithDigits[io];
    }
    cout << endl;

    per (int i = 0; io < SizeOfArray; i ++)
    {
    cout << setw(3) << arrWithDigits[io] << " |";
    }
    cout << endl;
    ritorno 0;
    }

    programma, in cui il codice di lavoro::Bloccare 16.01.
    ————– Costruire: Debug in Zadacha12 (compilatore: GNU GCC Compiler)—————

    mingw32-g ++. exe -Wall -g -c C:\2\codeblocks-16.01 codice Zadacha12 Zadacha12.cpp -o obj Debug Zadacha12.o
    mingw32-g ++. exe -o bin Debug Zadacha12.exe obj Debug Zadacha12.o
    file di output è bin Debug Zadacha12.exe con dimensioni 1,01 MB
    Processo terminato con lo stato 0 (0 minuto(S), 0 secondo(S))
    0 errore(S), 0 avvertimento(S) (0 minuto(S), 0 secondo(S))

    1. Il paradosso è quello che?
      Compilatore GCC è molto più perfetta che il compilatore di Microsoft, e molto più preciso nella sintassi conforme alla ++ linguaggio C.

  3. né della pila, non il cane, сразу @ int * prt = new int;@. brillantemente. in particolare la mancanza di una descrizione chiara circa la e commerciale piacque. una volta che il codice è mezza pagina.

    1. Per discutere e comprendere i segni di ogni risma, o un gruppo di, come concetto, e il dono non è necessario.

      “… basta non si sa come cucinare loro”.

Lascia un Commento

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