Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию