Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
27.04.2015
Размер:
290.5 Кб
Скачать

Int array[4]; /* array - массив из 4 элементов типа int */

double dd[10]; /* dd - масив из 10 элементов типа double */

float * ff [8] /* ff - масив из 8 указателей на float */

enum { False, True } bool [6];

/* bool - массив из 6 элементов перечислимого типа */

Для обращения к элементам массива следует указывать имя массива и индекс элемента заключенный в квадратные скобки. Например, array[2], dd[3].Заметим, что в языке С++ первый элемент массива имеет индекс равный0, и обращениеdd[3]обозначает обращение к четвертому элементу массиваdd.

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

Индексмассива часть имени переменной.   На самом деле индексация - это

  1. выбор элемента в массиве;

  2. справа от присваиваний и в выражениях - еще и разыменование, то есть взятие вместо имени переменной - значения, в ней хранящегося.

Массивы НЕЛЬЗЯ присваивать целиком, язык Си этого не умеет.  

int a[5]; int b[5];   a = b; /* ошибка */

Также нельзя присвоить значение сразу всем элементам (ячейкам) массива:

a = 0; /* ошибка */

не делает того, что нами ожидалось, а является ошибкой. Для обнуления всех ячеек следует использовать цикл:  

int i;   for(i=0; i < 5; i++) /* для каждого i присвоить a[i] = 0; */ a[i] = 0;

 В языке C++ существует сильная взаимосвязь между указателями и массивами, настолько сильная, что указатели и массивы действительно следует рассматривать одновременно. Например, когда объявляется массив в виде int array[25], то происходит не только выделение памяти для двадцати пяти элементов массива, но и для указателя с именемarray, значение которого равно адресу первого по счету (нулевого) элемента массива, т.е. сам массив остается безымянным, а доступ к элементам массива осуществляется через указатель с именемarray. С точки зрения синтаксиса языка указательarrayявляется константой, значение которой можно использовать в выражениях, но изменить это значение нельзя. Любую операцию, которую можно выполнить с помощью индексов массива, можно сделать и с помощью указателей. Вариант с указателями обычно оказывается более быстрым, но и несколько более трудным для непосредственного понимания, по крайней мере, для начинающего. Описание

int a[10];

определяет массив размера 10, т.е. Набор из 10 последовательных объектов, называемых a[0], a[1], ..., a[9].Записьa[i]соответствует элементу массива черезiпозиций от начала. Еслиpa- указатель целого, описанный как int *pa;то присваивание pa = &a[0];

приводит к тому, что paуказывает на нулевой элемент массиваa.Это означает, чтоpa содержит адрес элементаa[0].Теперь присваиваниеx = *pa;будет копировать содержимоеa[0]вx.

Если paуказывает на некоторый определенный элемент массиваa, то по определениюpa+1указывает на следующий элемент, и вообщеpa-iуказывает на элемент, стоящий наiпозиций до элемента, указываемогоpa, аpa+iна элемент, стоящий наiпозиций после. Таким образом, еслиpaуказывает наa[0],то*(pa+1) ссылается на содержимоеa[1].Выражениеpa+i-это адрес элементаa[i],а*(pa+i)содержимоеa[i].

Эти замечания справедливы независимо от типа переменных в массиве a. Суть определения "добавления 1 к указателю", а также его распространения на всю арифметику указателей, состоит в том, что приращение масштабируется размером памяти, занимаемой объектом, на который указывает указатель. Таким образом,iвpa+iперед прибавлением умножается на размер объектов, на которые указываетpa.

Очевидно, существует очень тесное соответствие между индексацией и арифметикой указателей. В действительности компилятор преобразует ссылку на массив в указатель на начало массива. В результате этого имя массива является указательным выражением. Отсюда вытекает несколько весьма полезных следствий. Так как имя массива является синонимом местоположения его нулевого элемента, то присваивание pa=&a[0]можно записать какpa= a.

Еще более удивительным, по крайней мере, на первый взгляд, кажется тот факт, что ссылку на a[i]можно записать в виде*(a+i).Эти две формы совершенно эквивалентны. Если применить операцию & к обеим частям такого соотношения эквивалентности, то мы получим, что&a[i]иa+iтоже идентичны:a+i- адресi-го элемента от началаa.С другой стороны, еслиpaявляется указателем, то в выражениях его можно использовать с индексом:pa[i]идентично*(pa+i).Любое выражение, включающее массивы и индексы, может быть записано через указатели и смещения и наоборот, причем даже в одном и том же утверждении.

Имеется одно различие между именем массива и указателем, которое необходимо иметь в виду: указатель является переменной, так что операции pa = aиpa++имеют смысл. Но имя массива является константой, а не переменной: конструкции типаa = paилиa++,илиp = &aбудут неправильными.

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

Если память выделяется под объект в момент компиляции (до выполнения программы), то размер объекта обязательно известен. Такое выделение памяти называется статическим.

Статическое создание

Динамическое создание

Создание в момент компиляции.

Размер массива известен

float mas [100];

Создание в момент выполнения. Размер массива неизвестен.

Создание объекта типа массив в 2 этапа:

1.В момент компиляции создается указатель на тип float *mas;

2. Используется оператор newchar * psymb;

psymb=new char;

-Если объект локальный, то удаляется автоматически по выходу из блока.

-Если объект глобальный, то удаляется автоматически, когда программа перестает работать

Для удаления используется delete

float*mas;

mas=new float[n];

delete[ ] mas;

 

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

int *t, *s;

t=new int;

s=new int [10];

Указатель tбудет указывать на переменную типаint, а указательsна массив из 10 элементов типаint.

Оператор deleteосвобождает ранее занятую память. Например,

//Статическое распределение памяти массива

#include <iostream.h>

Соседние файлы в папке 2 Уровень повыше. Теоретика