Ptr2,ptr1,ptr2-ptr1);
}
Результат: ptr2=160,ptr1=104,ptr2-ptr1=14
Так как указатель имеет тип long* (длина 4 байта), то «единица измерения» указателя равна 4 байтам.
В самом деле:
ptr1=100+1*4=104.
ptr2=200-10*4=160.
ptr2-ptr1=(160-104)/4=56/4=14.
Для чего нужны указатели? Указатели появились, прежде всего, для нужд системного программирования. Поскольку язык Си предназначался для "низкоуровневого" программирования, на нем нужно было обращаться, например, к регистрам устройств. У этих регистров вполне определенные адреса, т.е. необходимо было прочитать или записать значение по определенному адресу. Благодаря механизму указателей, такие операции не требуют никаких дополнительных средств языка.
int *ptr=(int*)200;
Однако использование указателей нуждами системного программирования не ограничивается. Указатели позволяют существенно упростить и ускорить ряд операций. Предположим, в программе имеется область памяти для хранения промежуточных результатов вычислений. Эту область памяти используют разные модули программы. Вместо того, чтобы каждый раз при обращении к каждому конкретному модулю копировать эту область памяти, мы можем передавать указатель на эту область в качестве аргумента вызова функции, тем самым упрощая и ускоряя вычисления.
Упомянутые в лекции примеры использования указателей никак не связаны с объектно-ориентированным программированием. Казалось бы, объектно-ориентированное программирование должно уменьшить зависимость от низкоуровневых конструкций типа указателей. На самом деле программирование с классами нисколько не уменьшило потребность в указателях, и даже наоборот, нашло им дополнительное применение, о чем будет рассказано в следующих лекциях.
Массивы
Массив – это один из структурированных типов данных. Это расположенные вплотную друг за другом в памяти элементы одного и того же типа. Каждый массив имеет имя. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.
Основные свойства массива:
ü Все элементы массива имеют один и тот же тип;
ü Все элементы массива расположены в памяти друг за другом; индекс первого элемента равен НУЛЮ.
ü Имя массива является указателем-константой, равной адресу начала массива (первого байта первого элемента массива)
Признаком массива при описании является наличие парных квадратных скобок [ ]. Константа или константное выражение в скобках задает число элементов массива.
Например:
char array[81];
int key[4];
При описании массива может быть выполнена инициализация его элементов. Существуют два метода инициализации массивов.
ü Инициализация по умолчанию. Это случай, когда все элементы массивов инициализируются нулями.
ü Явная инициализация элементов. Это случай, когда после описания массива помещается список начальных значений элементов массива, заключенный в фигурные скобки.
Существуют две формы явной инициализации элементов массива:
1) Явное указание числа элементов массива и список начальных значений, возможно, с меньшим числом элементов.
Например:
char array[10]={‘A’,’B’,’C’,’D’};
Здесь описывается массив из 10 элементов. Первые 4 элемента массива инициализируются символами ’A’,’B’,’C’,’D’. Значение остальных шести элементов либо равно нулю, либо не определено (в зависимости от способа объявления массива). Если список начальных значений содержит больше элементов, чем число в квадратных скобках, компилятор генерирует ошибку.
2) Неявное указание числа элементов массива со списком начальных значений. Компилятор определяет число элементов массива по списку инициализации.
Например:
char array[]={’A’,’B’,’C’,’D’};
В результате создается массив ровно из 4 элементов, и эти элементы получают начальные значения из списка инициализации.
Если при описании массива отсутствует значение в квадратных скобках и список начальных значений, компилятор обычно регистрирует ошибку. Однако в тех контекстах, где не требуется резервирование места в памяти под массив, этого не происходит. Эти случаи следующие:
1.Если массив объявляется как внешний, при этом в том месте, где массив описывается приведена информация о числе его элементов. Например:
extern char array[];
2.в описании функции, если указатель на первый элемент массива является аргументом функции. Например:
int function (int array[], int index)
{
// тело функции
}
3.В прототипах функций, использующих в качестве аргумента указатель на первый элемент массива.
Доступ к отдельным элементам массива может выполняться либо с помощью индекса, либо операцией взятия значения по адресу. В первом случае для ссылки на нужный элемент указывается его порядковый номер в массиве, заключенный в квадратные скобки. Самый первый элемент массива имеет порядковый номер 0. Например:
int array[]={1,2,3,4,5};
int index = 0, first, last, bad;
first = array[index]; // first = 1
last = array[4]; // last = 5
bad = a[index+6]; // bad случайно
В С++ для повышения производительности программы не выполняются многие проверки корректности вычислений, в том числе и контроль допустимости значения индекса массива. Поэтому в приведенном примере значение bad - это содержимое двух байтов памяти сразу после описанного массива a. Содержимое этих байтов случайно.
Для упрощения контроля границ индекса массива удобно использовать операцию sizeof, которая применительно к массивам возвращает чмсло байтов памяти, зарезервированных компилятором для массива. Например, так можно определить число элементов массива:
int array[10]={1,2,3,4,5,6,7};
Int members;
members=sizeof(array)/sizeof(int);
Нетрудно догадаться, что переменная members будет равна 10.
Другой способ доступа к элементам массива – использование механизма указателей. Так как имя массива – это указатель-константа на первый байт первого элемента массива, то, используя операцию взятия значения по адресу, можно выполнить доступ к любому из элементов массива. Так следующие выражения являются тождествами:
arrayтождественно&array[0],
(array+i)тождественно&array[i].
Использование указателей для доступа к элементам массива дает несколько более короткий код программы и в ряде случаев позволяет обойтись без дополнительных переменных, используемых в качестве индексов.
С++ поддерживает многомерные массивы. Размерность массива – это число индексов, используемых для ссылки на конкретный элемент массива. Многомерные массивы должны описываться и могут при описании инициализироваться. Например:
int matrix[10][20];
int m[3][3]={0, 1, 2,
10,11,12,
20,21,22};
char strings[3][80]=
{“Первая строка”,
“Втоая строка”,
“Третья строка”
};
Элементы многомерных массивов хрянятся в памяти в порядке возрастания самого правого индекса. Или, как иногда говорят, по строкам. Список начальных значений, задаваемых при описании массива, соответствует порядку элементов массива в памяти. Особый случай – инициализация двумерного массива строковыми литералами. В приведенном примере описывается двумерный массив strings, состоящий из 3-х строк по 80 символов (байт) каждая. Строки массива инициализируются символами строковых литералов. В конце каждого литерала помещается символ конца строки – ‘\0’.
Многомерные массивы могут инициализироваться и без указания одной (самой левой (!)) из размерностей массива в квадратных скобках. Компилятор в этом случае определяет число элементов по числу членов в списке инициализации. Например, для массива m будет получен тот же результат, что и в предыдущем примере.
int m[][3]={0, 1, 2,
10,11,12,
20,21,22};
Имя двумерного массива является указателем-константой на массив указателей констант. Элементами массива указателей являются указатели-константы на начало каждой из строк массива. Например, для двумерного массива matrix[2][2] указателями-константами на нулевую, первую и вторую строки будут соответственно matrix[0], matrix[1]иmatrix[2], а следующие выражения будут тождественными:
matrix[0]тождественно& matrix[0][0],
matrix[1]тождественно& matrix[1][0],
matrix[2]тождественно& matrix[2][0].
Как и для одномерных массивов, доступ к элементам двумерного массива может осуществляться по индексу или с помощью механизма указателей.
Рассуждения о многомерных массивах можно эксраполировать и на большее, чем 2 число размерностей. Однако на практике массивы с большей чем 3 размерностью встречаются редко.
Дата добавления: 2016-04-22; просмотров: 607;