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

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

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

2020-07-03 155
Присваивание указателю адреса области памяти в явном виде. 0.00 из 5.00 0 оценок
Заказать работу

Пример 5. Присваивание указателю адреса области памяти в явном виде. char* vp = (char *) 0хВ8000000; int* ip = (int *) 0хCAFE0000;

 

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

Пример 6. Присваивание указателю пустого значения. int *suxx = NULL; int *rulez = 0;

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

Такое выделение можно осуществить двумя способами: с помощью операции new и функции malloc.

Пример 7. Выделение памяти с помощью операции new. int *intPtr = new int; /*адрес начала выделенного участка памяти для размещения величины типа int записывается в переменную intPtr./* int *m = new int (10); /*кроме сказанного выше, производится инициализация выделенной динамической памяти значением 10.*/ int *q = new int [10]; /*операция new выполняет выделение памяти под 10 величин типа int и записывает адрес начала этого участка в переменную q, которая может трактоваться как имя массива */

Таким образом, операция new позволяет выделять память как под отдельный объект, так и целые блоки.

Пример 8. Выделение памяти с помощью функции malloc. #include <malloc.h> int *intPtr = (int *)malloc(sizeof(int));

С помощью функции выделения памяти malloc, унаследованной из библиотеки С выделяется участок динамической памяти для размещения величины типа int, адрес начала этого участка записывается в переменную intPtr.

Важно иметь ввиду, что память под указатель выделяется на этапе компиляции. В том случае, если это не удалось сделать, по стандарту, должно быть порождено исключение bad_alloc. Старые версии компиляторов при этом могут возвращать 0.

Освобождение памяти, выделенной с помощью операции new, выполняется с помощью операции delete в формате: delete n, delete [] q. В том случае если память была выделена с помощью функции malloc, для её освобождения должна быть использована функция free. Например, free (intPtr).

Если память выделялась с помощью new[], для освобождения памяти необходимо применять delete[] (размерность массива при этом не указывается). Если квадратные скобки отсутствуют, то сообщение об ошибке не выдается, однако помечен как свободный будет только первый элемент массива, а остальные окажутся недоступны для дальнейших операций.

Если переменная-указатель выходит из области своего действия, отведенная под нее память освобождается. Динамическая переменная, на которую ссылался указатель, становится недоступной.

Память из-под самой динамической переменной не освобождается!

Указатели. Операции.

Операции с указателями

С указателями можно выполнять следующие операции:

  • разадресация (или косвенное обращение к объекту) (*);
  • присваивание;
  • сложение с константой;
  • вычитание;
  • инкремент;
  • декремент;
  • сравнение;
  • приведение типов.

Операция разадресации

Операция разадресации предназначена для доступа к величине, адрес которой хранится в указателе.

Пример 9. Использование операции разадресации. char a; char *ptr = new char; /*выделение памяти под указатель и динамическую переменную типа char*/ *ptr = ‘Z’; a = *ptr; //присваивание значения переменным.

Если на одну и ту же область памяти ссылается несколько указателей различного типа, то примененная к ним операция разадресации даст разные результаты.

Пример 10. #include <stdio.h> int main(){ unsigned long int A = 0Xcc77ffaa; unsigned short int* pint = (unsigned short int*) &A; unsigned char* pchar = (unsigned char *) &A; printf("| %x | %x | %x |", A, *pint, *pchar); return 0; }

Результат выполнения программы выглядит следующим образом: | cc77ffaa | ffaa | аа |

Арифметические операции с указателями

Арифметические операции с указателями (сложение с константой, вычитание, инкремент и декремент) автоматически учитывают размер типа величин, адресуемых указателями.

Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.

Инкремент и декремент

Применительно к указателям, инкремент позволяет переместить указатель к следующему элементу массива, а декремент к предыдущему. Фактически значение указателя изменяется на величину sizeof (тип).

Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа.

Пример 11. Использование операции инкремент. short *shortPtr = new short [5]; shortPtr++; //значение shortPtr увеличивается на 2 long *longPtr = new long [5]; longPtr++; //значение longPtr увеличивается на 4

Разность двух указателей

Разность двух указателей определяется как разность их значений, делённая на размер типа данных, выраженного в байтах. Применительно к массивам разность указателей, например, на третий и шестой элементы равна 3.

Важно помнить, что суммирование указателей ни в коем случае не допускается.

Ссылки

Под ссылкой понимается неявный указатель, который имеет синтаксис указуемого объекта. Иными словами, под ссылкой понимается синоним имени, указанного при её инициализации. Ссылку можно рассматривать как указатель, который всегда разыменовывается. Однако, в отличие от указателя, ссылка не занимает дополнительного пространства в памяти.

Синтаксис объявления ссылки:

типДанных &идентификатор

Существуют следующие правила при использовании ссылок:

    1. переменная, являющаяся ссылкой, должна быть явно инициализирована при её объявлении, кроме тех случаев, когда ссылка является параметром функции, описана как extern или ссылается на поле класса;
    2. после инициализации ссылке не может быть присвоена другая переменная;
    3. тип ссылки должен соответствовать типу величины, на которую она ссылается;
    4. запрещено определять указатели на ссылки, создавать ссылки на ссылки и массивы ссылок.

Чаще всего, ссылки применяются в качестве параметров функций и типов возвращаемых функциями значений. Ссылки позволяют использовать в функциях переменные, которые передаются по адресу, без необходимости проведения операции разадресации, что позволяет повысить читабельность программного кода.

Выполнение любых операций над ссылками, приводит к изменению величины, на которую они ссылаются.

 


Поделиться с друзьями:

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.