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

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Присваивание указателю адреса существующего объекта.

2020-07-03 154
Присваивание указателю адреса существующего объекта. 0.00 из 5.00 0 оценок
Заказать работу

Указатель на объект

Любой указатель, как и любая переменная имеет какой-то конкретный тип данных. Тип данных – это тип той переменной, адрес которой хранится в указателе.

Синтаксис объявления указателя имеет следующий вид:

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

Переменная объявленная в качестве указателя занимает 4 байта.

Для работы с этим типом данных определены две основные операции: * (разыменовывание) и & (получение адреса). Первая предназначена для получения значения переменной, которое хранится по адресу, содержащемуся в указателе. Вторая операция, в свою очередь, позволяет получить адрес переменной.

Пример 1. char a; // a – переменная char *ptr; // ptr – указатель ptr = &a; // инициализация значения указателя адресом переменной

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

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

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

Аналогичным образом можно объявить указатель на указатель на указатель и т.д. Как правило, такие указатели используются при передаче многомерных массивов.

Указатель на функцию

Такие указатели содержат адрес сегмента кода, в котором расположен исполняемый код функции, то есть адрес, по которому передаётся управление при вызове функции.

Как правило, указатели на функции используются для косвенного вызова функции, а также передачи имени функции в другую функцию в качестве параметра.

Синтаксис объявления указателя на функцию выглядит следующим образом:

тип (*имя) (список_типов_аргументов);

Указатель на void

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

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

Инициализация указателей

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

Существует 4 способа инициализации указателя:

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

Присваивание указателю адреса существующего объекта.

Пример 2. Инициализация указателей с помощью операции получения адреса. int а = 5; // целая переменная int* рtr = &а; // в указатель записывается адрес а Пример 3. Инициализация указателей с помощью другого инициализированного указателя. int* pPtr = ptr; // указатель ptr содержит адрес а Пример 4. Инициализация указателей с помощью имени массива или функции, которые трактуются как адреса. int b[10]; // массив int* t = b; // присваивание адреса начала массива <…> void f(int a){ /*... */ } // определение функции void (*pf)(int); // указатель на функцию pf = f; // присваивание адреса функции

ой арифметике.

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

Пустой указатель

До момента инициализации указателя он, как и любая другая переменная, хранит в себе какой-то «мусор». Несомненно, этот «мусор» может оказаться каким-то валидным адресом, по которому расположены какие-то данные, но использование значения по подобному адресу может привести к логической ошибке. Проверить то, что указатель хранит какую-то «гадость» практически невозможно. Однако для решения описанной проблемы в библиотеке srdlib введён макрос NULL.

При определении указателя, в том случае если он не инициализируется каким-то конкретным значением, принято присваивать ему значение NULL. Таким образом программист получает нулевой указатель, в котором гарантированно не может оказаться какое-то «мусорное» значение, если только разработчик сам не присвоил ему это значение.

В соответствии со стандартом, нулевой указатель (т.е. инициализированный значением NULL) будет равен нулю и может быть использован как false.

int *ptr = NULL; if (ptr == 0){ <…> }

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

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

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

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

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

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

Пример 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. запрещено определять указатели на ссылки, создавать ссылки на ссылки и массивы ссылок.

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

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

 

Указатель на объект

Любой указатель, как и любая переменная имеет какой-то конкретный тип данных. Тип данных – это тип той переменной, адрес которой хранится в указателе.

Синтаксис объявления указателя имеет следующий вид:

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

Переменная объявленная в качестве указателя занимает 4 байта.

Для работы с этим типом данных определены две основные операции: * (разыменовывание) и & (получение адреса). Первая предназначена для получения значения переменной, которое хранится по адресу, содержащемуся в указателе. Вторая операция, в свою очередь, позволяет получить адрес переменной.

Пример 1. char a; // a – переменная char *ptr; // ptr – указатель ptr = &a; // инициализация значения указателя адресом переменной

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

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

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

Аналогичным образом можно объявить указатель на указатель на указатель и т.д. Как правило, такие указатели используются при передаче многомерных массивов.

Указатель на функцию

Такие указатели содержат адрес сегмента кода, в котором расположен исполняемый код функции, то есть адрес, по которому передаётся управление при вызове функции.

Как правило, указатели на функции используются для косвенного вызова функции, а также передачи имени функции в другую функцию в качестве параметра.

Синтаксис объявления указателя на функцию выглядит следующим образом:

тип (*имя) (список_типов_аргументов);

Указатель на void

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

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

Инициализация указателей

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

Существует 4 способа инициализации указателя:

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

Присваивание указателю адреса существующего объекта.

Пример 2. Инициализация указателей с помощью операции получения адреса. int а = 5; // целая переменная int* рtr = &а; // в указатель записывается адрес а Пример 3. Инициализация указателей с помощью другого инициализированного указателя. int* pPtr = ptr; // указатель ptr содержит адрес а Пример 4. Инициализация указателей с помощью имени массива или функции, которые трактуются как адреса. int b[10]; // массив int* t = b; // присваивание адреса начала массива <…> void f(int a){ /*... */ } // определение функции void (*pf)(int); // указатель на функцию pf = f; // присваивание адреса функции

ой арифметике.

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

Пустой указатель

До момента инициализации указателя он, как и любая другая переменная, хранит в себе какой-то «мусор». Несомненно, этот «мусор» может оказаться каким-то валидным адресом, по которому расположены какие-то данные, но использование значения по подобному адресу может привести к логической ошибке. Проверить то, что указатель хранит какую-то «гадость» практически невозможно. Однако для решения описанной проблемы в библиотеке srdlib введён макрос NULL.

При определении указателя, в том случае если он не инициализируется каким-то конкретным значением, принято присваивать ему значение NULL. Таким образом программист получает нулевой указатель, в котором гарантированно не может оказаться какое-то «мусорное» значение, если только разработчик сам не присвоил ему это значение.

В соответствии со стандартом, нулевой указатель (т.е. инициализированный значением NULL) будет равен нулю и может быть использован как false.

int *ptr = NULL; if (ptr == 0){ <…> }

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

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

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

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



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

0.035 с.