Указатели и массивы Указатели


int а = 5; // целая переменная



жүктеу 1,96 Mb.
бет4/12
Дата17.01.2022
өлшемі1,96 Mb.
#32980
түріУказатель
1   2   3   4   5   6   7   8   9   ...   12
Указатели и массивы

int а = 5; // целая переменная
int* р = &а; / / в указатель записывается адрес а

int* р (&а): // то же самое другим способом

  1. с помощью значения другого инициализированного указателя: int* r = р;




  1. с помощью имени массива или функции, которые трактуются как адрес (см. «Массивы», с. 58, и «Передача имен функций в качестве параметров», с. 80):








  1. Присваивание указателю адреса области памяти в явном виде:


Здесь ОхВ8000000 — шестнадцатеричная константа, (char *) — операция приве­ дения типа: константа преобразуется к типу «указатель на char».


Присваивание пустого значения

:


      1. первой строке используется константа NULL, определенная в некоторых за­ головочных файлах С как указатель, равный нулю. Рекомендуется использо­ вать просто О, так как это значение типа 1 nt будет правильно преобразовано стандартными способами в соответствии с контекстом. Поскольку гарантиру­ ется, что объектов с нулевым адресом нет, пустой указатель можно использо­ вать для проверки, ссылается указатель на конкретный объект или нет.




  1. Выделение участка динамической памяти и присваивание ее адреса указателю:




    1. с помощью операции new:




int* п = new 1nt:

(10);

//1

1nt* m = new 1nt

// 2

1nt* q = new 1nt

[10];

/

3

• с помощью функции mal 1 oc^







1nt* u = (int *)malloc(s1zeof(int));

/

4

  1. операторе 1 операция new выполняет выделение достаточного для размещения величины типа 1 nt участка динамической памяти и записывает адрес начала это­ го участка в переменную п. Память под саму переменную п (размера, достаточно­ го для размещения указателя) выделяется на этапе компиляции.




  1. операторе 2, кроме описанных выше действий, производится инициализация выделенной динамической памяти значением 10.




  1. операторе 3 операция new выполняет выделение памяти под 10 величин типа int (массива из 10 элементов) и записывает адрес начала этого участка в пере­ менную q. которая может трактоваться как имя массива. Через имя можно обра­ щаться к любому элементу массива. О массивах рассказывается на с. 58.

Если память выделить не удалось, по стандарту должно порождаться исключе­ ние bad^alloc (об исключениях рассказывается в разделе «Обработка исключи­ тельных ситуаций», с. 222, а об обработке ошибок выделения памяти — на с. 378). Старые версии компиляторов могут возвращать 0.




    1. операторе 4 делается то же самое, что и в операторе 1, но с помощью функции выделения памяти та 11 ос, унаследованной из библиотеки С, В функцию переда­ ется один параметр — количество выделяемой памяти в байтах. Конструкция (int*) используется ц,ля приведения типа указателя, возвращаемого функцией,




  1. требуемому типу (о явном преобразовании типов см. с. 231). Если память выде­ лить не удалось, функция возвращает 0.

Операцию new использовать предпочтительнее, чем функцию та 11 ос, особенно при работе с объектами.


Освобождение памяти, выделенной с помощью операции new, должно выпол­ няться с помощью delete, а памяти, выделенной функцией та 11 ос — посредством


  1. Для того чтобы использовать malloc, требуется подключить к программе заголовочный файл . функции free. При этом переменная-указатель сохраняется и может инициализироваться повторно. Приведенные выше динамические переменные уничтожа­ ются следующим образом:

delete n; delete m; delete [ ] q; free (u);


Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[]. Размерность массива при этом не указывается. Если квад­ ратных скобок нет, то никакого сообщения об ошибке не выдается, но помечен как свободный будет только первый элемент массива, а остальные окажутся не­ доступны для дальнейших операций. Такие ячейки памяти называются мусором.
ВНИМАНИЕ
Если переменная-указатель выходит из области своего действия, отведенная под нее па­ мять освобождается. Следовательно, динамическая переменная, на которую ссылался ука­ затель, становится недоступной. При этом память из-под самой динамической переменной не освобождается. Другой случай появления «мусора» — когда инициализированному указателю присваивается значение другого указателя. При этом старое значение бесследно теряется.


  1. C помощью комбинаций звездочек, круглых и квадратных скобок можно описы­ вать составные типы и указатели на составные типы, например, в операторе

1nt *(*р[10])();


объявляется массив из 10 указателей на функции без параметров, возвращающих указатели на 1 nt.
По умолчанию квадратные и круглые скобки имеют одинаковый приоритет, больший, чем звездочка, и рассматриваются слева направо. Для изменения по­ рядка рассмотрения используются круглые скобки.
При интерпретации сложных описаний необходимо придерживаться правила «изнутри наружу»:


  1. если справа от имени имеются квадратные скобки, это массив, если скобки круглые — это функция;




  1. если слева есть звездочка, это указатель на проинтерпретированную ранее конструкцию;




  1. если справа встречается закрывающая круглая скобка, необходимо применить приведенные выше правила внутри скобок, а затем переходить наружу;




  1. в последнюю очередь интерпретируется спецификатор типа.

Для приведенного выше описания порядок интерпретации указан цифрами:


1nt *(*р[10])():

жүктеу 1,96 Mb.

Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   ...   12




©g.engime.org 2024
әкімшілігінің қараңыз

    Басты бет
рсетілетін қызмет
халықаралық қаржы
Астана халықаралық
қызмет регламенті
бекіту туралы
туралы ережені
орталығы туралы
субсидиялау мемлекеттік
кеңес туралы
ніндегі кеңес
орталығын басқару
қаржы орталығын
қаржы орталығы
құрамын бекіту
неркәсіптік кешен
міндетті құпия
болуына ерікті
тексерілу мемлекеттік
медициналық тексерілу
құпия медициналық
ерікті анонимді
Бастауыш тәлім
қатысуға жолдамалар
қызметшілері арасындағы
академиялық демалыс
алушыларға академиялық
білім алушыларға
ұйымдарында білім
туралы хабарландыру
конкурс туралы
мемлекеттік қызметшілері
мемлекеттік әкімшілік
органдардың мемлекеттік
мемлекеттік органдардың
барлық мемлекеттік
арналған барлық
орналасуға арналған
лауазымына орналасуға
әкімшілік лауазымына
инфекцияның болуына
жәрдемдесудің белсенді
шараларына қатысуға
саласындағы дайындаушы
ленген қосылған
шегінде бюджетке
салығы шегінде
есептелген қосылған
ұйымдарға есептелген
дайындаушы ұйымдарға
кешен саласындағы
сомасын субсидиялау