Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_ekzamen_po_OAiP_shpora.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
231 Кб
Скачать
☆
  1. Указатели как тип данных. Операции * и &. Операции над указателями.

Обращение к объектам любого типа в языке C может проводиться по имени, как мы до сих пор делали и по указателю (косвенная адресация).

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

Указатель объявляется следующим образом:

тип *идентификатор;

Например: int *a, *d;

float *f;

Здесь объявлены указатели a, d, которые можно инициализировать адресами целочисленных переменных и указатель f, который можно инициализировать адресами вещественных переменных.

С указателями связаны две унарные операции: & и *. Операция & означает «взять адрес». Данная операция допустима только над переменными. Операция * - «значение, расположенное по указанному адресу» и работает следующим образом:

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

2.извлекается информация из этого участка памяти и трактуется как адрес переменной с типом в объявлении указателя;

3.производится обращение к участку памяти по выделенному адресу для проведения некоторых действий.

Указатель может использоваться в выражениях вида:

p # ie, ##p, p##, p# = ie,

где p - указатель, ie - целочисленное выражение, # - символ операции '+' или '-'.

Значением таких выражений является увеличенное или уменьшенное значение указателя на величину ie*sizeof(*p). Следует помнить, что операции с указателями выполняются в единицах памяти того типа объекта, на который ссылается этот указатель.

  1. Одномерные массивы и связь с указателями.

Указатели и массивы в языке С тесно связаны между собой. Имя массива является указателем на его первый элемент, т.е. для массива

int p[10],

p

p[0]

имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива это адрес начала последовательно расположенных элементов массива. Рассмотрим обращение к элементам массива на примере. Пусть объявлены - массив из 100 бъектов типа float и указатель на объект типа float:

float p[100];

float *q;

int i;

если выполнить операцию q=p;

то обращения к элементу массива p: p[i] *(q+i) и *(p+i) эквивалентны.

Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма удобнее для читаемости текста, но вторая обычно эффективнее по быстродействию программы.

Очевидна эквивалентность выражений

&q[0] <-> &(*q) <-> q // адрес нулевого элемента массива

*q <-> q[0] // значение нулевого элемента массива

Для определения размера памяти, необходимого для размещения объектов в языке С используется унарная операция:

int sizeof(параметр);

параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof возвращает размер памяти в байтах, отводимый под объект.

Если указан идентификатор сложного объекта (массив, структура, объединение), то результатом является размер всего сложного объекта.

Например:

sizeof(int) результат 2 байта,

int b[5]; sizeof(b) результат 10 байт;

int c[3][4]; sizeof(c) результат 24 байта.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]