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


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



бет4/12
Дата06.01.2022
өлшемі1,96 Mb.
#15493
түріУказатель
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   2   3   4   5   6   7   8   9   ...   12




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

    Басты бет