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 – размер массива должен быть константой. То есть целочисленная константа должна быть инициализирована до объявления массива и мы не можем запросить её ввод с клавиатуры. Поэкспериментируйтепроверьте.

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

указатели с++, указатели c++, new, delete
Тут нам подсвечивает красным оператор >> так как изменять константное значение нельзя.

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

указатели с++, указатели c++, new, delete
Тут нас предупреждают о том, что размером массива НЕ может быть значение обычной переменной. Необходимо константное значение!

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

В следующем коде мы будем использовать указатель и новые для вас операторы nuovo (выделяет память) e cancellare (освобождает память).

Пользователь вводит значение с клавиатуры – fila 12. Ниже определён указатель: int* arrWithDigits Questa voce significa, che arrWithDigits – un puntatore. Он создан для хранения адреса ячейки, в которой будет находиться целое число. In questo caso, arrWithDigits будет указывать на ячейку массива с индексом 0. Знак * тот же что применяется при умножении. По контексту компилятор “capirà”, что это объявление указателя, а не умножение. Далее следует знак = и оператор nuovo, который выделяет участок памяти. Мы помним, что у нас память должна быть выделена под массив, а не под одно число. Запись nuovo int [sizeOfArray] можно расшифровать так: nuovo (выдели память) int (interi bagagli) [sizeOfArray] (в количестве sizeOfArray).

Таким образом в строке 16 был определён array dinamico. Questo significa, что память под него выделится (или не выделится) во время работы программы, а не во время компиляции, как это происходит с обычными массивами. То есть выделение памяти зависит от развития программы и решений, которые принимаются непосредственно в её работе. In questo caso, – зависит от того, что введёт пользователь в переменную sizeOfArray

on line 25 применяется оператор cancellare. Он освобождает выделенную оператором nuovo память. da nuovo выделил память под размещение массива, 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 и именем указателя ставятся квадратные скобки [] – cancellare [] arrWithDigits; Tenete a mente, что каждый раз, когда выделяется память с помощью nuovo, необходимо эту память освободить используя cancellare. naturalmente, по завершении программы память, занимаемая ей, будет автоматически освобождена. Но пусть для вас станет хорошей привычкой использование операторов nuovo e cancellare в паре. Ведь в программе могут располагаться 5-6 массивов например. И если вы будете освобождать память, каждый раз, когда она уже не потребуется в дальнейшем в запущенной программепамять будет расходоваться более разумно.

Допустим в нашей программе мы заполнили массив десятью значениями. Далее посчитали их сумму и записали в какую-то переменную. И всёбольше мы с этим массивом работать уже не будем. Программа же продолжает работу и в ней создаются новые динамические массивы для каких-то целей. В этом случае целесообразно освободить память, che occupa il primo array. Тогда при выделении памяти под остальные массивы эта память может быть использована в программе повторно.

Рассмотрим использование указателей, как параметров funzione. per un avvio, наберите и откомпилируйте следующий код. В нем функция получает две переменные и предлагает внести изменения в их значения.

Запустите программу и введите новые значения переменных. Вы увидите в итоге, что по завершении работы функции, переменные не изменились и равны 0.

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

Come ricorderete, функция работает не на прямую с переменными, а создает их точные копии. Эти копии уничтожаются после выхода из функции. То есть функция получила в виде параметра какую-то переменную, создала её копию, поработала с ней и уничтожила. Сама переменная останется при этом неизменной.

Используя указатели, мы можем передавать в функцию адреса переменных. Тогда функция получит возможность работать непосредственно с данными переменных по адресу. Внесём изменения в предыдущую программу.

В заголовке (fila 27) и прототипе функции (fila 5), добавляем операцию * 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). & означает взятие адреса. Вы помните, что указатель хранит адрес. Поэтому мы не можем передать обычное значение, если в заголовке указано, что функция примет указатель. Используя & перед именами переменных, функция получит их адреса.

В теле функции, при вводе значений в переменные, необходимо использовать разыменование указателей. Делается это с помощью всё той же операции * : gin >> *varForCh1; Так мы внесем изменения в значения переменных, а не в адреса. Проверим работу программы:

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

Всё получилосьзначения переменных были изменены в функции.

Такой способ (передача параметров в функцию через указатель) широко использовался в программировании на C. В C++ всё чаще используют передачу параметров в функцию по ссылке. Там отпадает необходимость использовать разыменование * и взятие адреса & variabili. Поэтому использовать передачу параметров по ссылке удобней. Этот способ мы с вами рассмотрим в следующих уроках.

Не переживайте, если что-то не совсем понятно. Вы получили много новой информации в этом урокеи это вполне нормально, что не всё воспринялось сразу. Понимание указателей придет с практикой. Мы еще поговорим об указателях во второй части к этой статье e порешаем задачи. Так что все будет нормально.

По возможности посмотрите видео об указателях (con 12 minuti di):

parametri (argomenti) funzione:




Iscriviti ai nuovi articoli sul nostro sito preavviso:


Accetto di ricevere messaggi da purecodecpp.com sulla mia e-mail

data
pagina
I puntatori C ++. Dinamico array C ++
valutazione
5

7 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;
    }

    И это у меня вполне компилируется.

    1. Вы могли бы и не присваивать M=N, а просто написать: int d[N].
      Но это не противоречит ничему сказанному – esso расширение стандарта C++, пришедшее из стандарта C99 языка C (come si può vedere, всё это стандарты самых последних лет!), и называется это VLA (Variable Legth Array).
      Это расширение позволяет создавать локальные внутри функции массивы с динамически определяемыми размерами. При этом массив создаётся в стеке вызываемой функции. fondamentalmente, в C был и раньше скрытый способ делать то же самое с помощью вызова:

      Пользоваться VLA нужно, тем не менее, с осторожностью:
      это компилируется только если у компилятора установлены опции на новые стандарты;
      это нововведение вызывает много споров, и может быть отменено в будущих стандартах.

      1. Спасибо за подробные разъяснения. Я присваивал М = N из-за того, что автор видео показал, как напрямую, если не использовать ключевое слово const, не компилируется. А я сразу решил проверить, но немного по другому. a proposito, в компиляторе давно я указывал с++11.

  2. Парадокс!!!
    Компиляторcompiler: GNU GCC Compilerпринял следующий код:

    #includere
    #includere

    using namespace std;

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

    int SizeOfArray;
    cout << "Сколько чисел вы введёте в массив? " <> SizeOfArray;
    int arrWithDigits[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, в которой работаю Code::Block 16.01.
    ————– Build: Debug in Zadacha12 (compiler: GNU GCC Compiler)—————

    mingw32-g++.exe -Wall -g -c C:\2\codeblocks-16.01\Code\Zadacha12\Zadacha12.cpp -o obj\Debug\Zadacha12.o
    mingw32-g++.exe -o bin\Debug\Zadacha12.exe obj\Debug\Zadacha12.o
    Output file is bin\Debug\Zadacha12.exe with size 1,01 MB
    Process terminated with status 0 (0 minute(S), 0 secondo(S))
    0 errore(S), 0 warning(S) (0 minute(S), 0 secondo(S))

    1. Парадокс то в чём?
      Компилятор GCC намного совершеннее компилятора от Microsoft, и гораздо точнее в синтаксисе соответствует стандартам языка C++.

Lascia un Commento

Inserire il codice nei tag: <pre class="lang:C ++ decodifica:true ">IL TUO CODICE</pre>