пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Операции с указателями на массив.Адресная арифметика. Преобразования указателей

 

Имя массива - это адрес области памяти, распределенной под данный массив, то есть фактически, это адрес первого элемента массива.

Операция х=*ра позволяет копировать содержимое а[0] в переменную х.

Допустимые операции: 
ра=а   и    ра++

Присваивание адреса нулевого элемента массива  ра=&a[0] равносильно  ра=а

Обращение к элементу массива: индексация массива и адресная арифметика


Под адресной арифметикой понимаются действия над указателями, связанные с использованием адресов памяти.

1. Присваивание. 

2. Взятие адреса. 

3. Косвенная адресация. 

4. Преобразование типа. Операция преобразования типа указателя применяется в виде (<тип> *)<указатель> :

5. Определение размера. Для определения размера указателя можно использовать операцию размер в виде sizeof(<указатель>)

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

7. Индексация. Указатель может индексироваться применением к нему операции индексации, обозначаемой в Си квадратными скобками [ ]. Индексация указателя имеет вид<указатель>[<индекс>], где <индекс> записывается целочисленным выражением.

8. Увеличение/уменьшение.

9. Сложение.

10. Вычитание.

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

  • сложение двух указателей;
  • вычитание двух указателей на различные объекты;
  • сложение указателей с числом с плавающей точкой;
  • вычитание из указателей числа с плавающей точкой;
  • умножение указателей;
  • деление указателей;
  • поразрядные операции и операции сдвига;

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


Присваивание значения указателя одного типа указателю другого типа сопровождается действием, которое называется в Си преобразованием типа указателя, и которое в Си++ обозначается всегда явно. Операция (int*)p меняет в текущем контексте тип указателя char* на int*. На самом деле это действие является чистой фикцией (команды транслятором не генерируются). Транслятор просто запоминает, что тип указуемой переменной изменился, поэтому операции адресной арифметики и косвенного обращения нужно выполнять с учетом нового типа указателя.

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

 


13.06.2016; 18:59
хиты: 84
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь