Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Лекция 13. В языке С++ указатели и массивы тесно связаны между собой
Указатели и массивы
В языке С++ указатели и массивы тесно связаны между собой. По определению, имя массива является указателем – константой, значением которого является адрес первого элемента массива (с индексом 0). Таким образом, для любого массива соблюдается правило: <имя массива> = &<имя массива> = &<имя массива>[0] Поскольку <имя массива> - указатель, то к нему можно применять арифметические операции. Тогда действие индексных скобок в записи <имя массива>[<индекс>] можно объяснить так: *(<имя массива> + <индекс>) Индекс элемента определяет смещение относительно начала массива. Пример: int z[3]; Тогда *(z+0) – это обращение к первому элементу z[0], *(z+1) – это обращение ко второму элементу z[1], *(z+2) – это обращение к третьему элементу z[2]. Необходимость использования круглых скобок в выражении *(z+i)обусловлена тем, что приоритет у операции ‘ *’ выше, чем у ‘+’. Итак, в С++ предусмотрены 2 способа доступа к элементам массива: с помощью индексирования массивов и арифметики указателей. Следует отметить, что арифметические операции над указателями выполняются быстрее, чем индексирование массивов. Поскольку быстродействие в программировании часто является определяющим фактором при выборе решения, то использование указателей для доступа к элементам массива – характерная особенность многих С++ - программ. Кроме того, иногда указатели позволяют написать более компактный код по сравнению с использованием индексирования массивов. Пример. Вывести на экран символы заданной строки в столбик. #include <iostream.h> void main() { char X[ ] = “abcdef”; int i = 0; while (*(X + i)!= ‘\0’) // X[i]!= ‘\0’ cout << “\n” << *(X+i++); // X[i++] } Результат: a b c d e f
Индексирование указателя. В языке С++ указатель, который ссылается на массив, можно индексировать так, как если бы это было имя массива. Рассмотрим пример. #include <iostream.h> void main() { char *p; char X[80] =”abcdef”; int i = 0; p = X; // присваиваем указателю р адрес начала массива while (p[i]!= ‘\0’) cout << “\n” << p[i++]; } При выполнении этой программы указатель pиндексируется, что допустимо, поскольку выражение p[i] идентично по своему действию *(p+i). Доступ к элементам многомерных массивов возможен также с помощью [ ] и с помощью указателей. В общем случае переменная с индексами Z[i][j][k] соответствует выражению *(*(*(z+i)+j)+k) Указатели можно связывать с массивами как во время определения, так и в процессе выполнения программы. Для этого существуют следующие возможности: 1) <type>*<имя указателя> = <имя уже определенного массива типа type>; 2) <type>*<имя указателя> = new <type>[ <размер массива>]; Например: 1) int array[ ] = { 10,20,30,50 }; // массив int *ptrarray = array; // указатель связали с массивом
2) int *ptrarray = new int[4]; // указатель связали с выделенным участком памяти
Указатели и строки В языке С++ строка представляется в виде одномерного символьного массива, последним элементом которого является нулевой байт. Если для инициализации символьного массива используется строка
char array[ ] =”<инициализирующая строка>”;
то адрес первого символа строки становится значением указателя – константы array. Если строка используется для инициализации указателя типа char*: char *ptr = “<инициализируюшая строка>”; то адрес первого элемента строки становится значением указателя ptr
Пример.
#include <iostream.h> #include <string.h> // strlen() void main() { char *array1 = “0123456789”; // массив символов инициализируется строкой int k = strlen(array1) + 1; char *array2 = new char[k]; for (int i = 0; i < k;) array2[i++] = *array1++; cout << “array2=” << array2; } Результат:
0 1 2 3 4 5 6 7 8 9
В программе определен и инициализирован массив – строка array1. С помощью операции new выделена память для такого же по типу и размерам массива, связанного с указателем array2. Доступ к элементам массива, связанного с указателем array2 реализован с помощью [ ], а к элементам второго массива с помощью операции *. Указатель array1 меняется, перемещаясь по элементам массива, поэтому нельзя вывести array1 (будет пустая строка). Таким образом, указатели и массивы тесно связаны между собой. Например, с помощью указателя, который содержит адрес начала массива, можно получить доступ к элементам этого массива либо посредством адресной арифметики, либо посредством индексирования массива. Вопросы 1.Имя массива 1.является указателем-константой; 2.является адресом первого элемента массива; 3.не связано с памятью компьютера. Date: 2015-12-12; view: 530; Нарушение авторских прав |