Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

4.5 Массивы

Если в языке C++/CLI массивы в зависимости от типа данных могут быть размещены по желанию программиста в стеке, неуправляемой или в управляемой кучах, то в языках Java и C# массивы всегда размещаются посредством оператора new только в управляемой куче. В языках Java и C# массив является объектом, который указывает на множество других объектов или базовых типов данных.

Рассмотрим создание одномерных массивов на языках C++/CLI, Java и C#.

C++/CLI. В языке C++/CLI массив размещается в стеке, если он объявлен как

тип имя_массива [размер];

Ссылка к такому массиву осуществляется с помощью индексированной переменной

имя_массива [индекс]

Допускается инициализация массива при его описании:

тип имя_массива [размер]= {список инициализации};

где список инициализации состоит из значений элементов массива, отделённых друг от друга запятыми.

Для размещения массива в неуправляемой куче используется оператор new и указатель, которому оператор new присваивает адрес этого размещённого массива:

тип *указатель-массива = new тип [размер];

При ссылке к элементу массива по указателю применяется звёздочка и индекс этого элемента в массиве:

*(указатель + индекс)

Но дозволяется применить ссылку с индексированной переменной

имя_массива [индекс]

Массив неуправляемых данных, созданный с помощью оператора new, удаляется из кучи оператором delete.

Описание массива управляемых объектов необычно. Для размещения массива в управляемой куче используется ключевое слово array, оператор gcnew и дескриптор, которому оператор gcnew присваивает ссылку на этот массив:

аггау <тип [, разм]> Адескриптор-массива;

дескриптор-массива = gcnew аггау<тип[, разм]> (длина [, длина] ...);

Здесь

тип - тип элементов массива;

разм - размерность массива; если массив одномерный, то размерность можно не указывать;

длина - длина размерности массива.

дескриптор-массива - управляемая ссылка (дескриптор) на массив.

При ссылке к элементу массива применяется дескриптор и индексы этого элемента в массиве:

дескриптор-массива [индекс [ , индекс] ...]

Описание одномерного управляемого массива выглядит так:

аггау<тип> Адескриптор-массива;

дескриптор-массива = gcnew аггау<тип> (длина);

Заметим, что количество элементов массива (длина) указывается в круглых скобках.

После создания управляемый массив надлежит инициализировать, например одномерный массив так

array<int>^ ints= gcnew array<int>(2);

ints[0]=50; ints[l]=60;

или при создании

array<int>^ intsl= gcnew array<int>(2){50, 60};

А двумерный массив таким образом

array <float,2>^ floats= gcnew array<float,2> (2,3);

floats[0,0]=l; floats[0,l]=2; floats[0,2]=3;

floats[l,0]=4; floats[l,l]=5; floats[l,2]=6;

или при создании

array<float,2>^ floats1;

floatsl= gcnew array<float,2> (2,3){{l,2,3},{4,5,6}};

Следует обратить внимание на то, что при создании массива объектов в куче оператор gcnew выделяет память под массив ссылок. Поэтому требуется ещё инициализировать каждую из этих ссылок путем создания самих объектов в куче с помощью соответствующих операторов gcnew.

Java и C#. Переменная массива в языках Java и C# является переменной ссылочного типа. Объявление массива отличается от объявления в языке C++/CLI:

тип [] ссылочная_переменная = new тип [размер];

Заметим, что квадратные скобки размещены между типом тип элементов массива и ссылочной переменной ссылочная переменная. А количество размер элементов массива помещается в квадратные скобки после оператора new и типа.

Ссылка к такому массиву осуществляется посредством ссылочной переменной с индексом:

ссылочная_переменная [индекс]

Массив - это управляемое данное (объект) языков Java и C#. Когда массив создаётся с помощью оператора new, он размещается сборщиком мусора в управляемой куче и удаляется при ненадобности сборщиком мусора.

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

В языке Java каждый объект массива содержит переменную length, определяющую длину массива.

Языки Java и C# допускают инициализацию массива при его создании:

тип [] ссылочная_переменная= {список_инициализации};

Язык Java разрешает ещё такую инициализацию массива при его создании:

тип [] ссылочная_переменная= new тип [] {список_инициализации};

Пример 4.5.1. Описание одномерных неуправляемых массивов на языке C++/CLI.

///////////////

// C++/CLI

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)

{

float mas1[3]= {1.1F, 1.2F, 1.3F}; // Массив в стеке

for (int i= 0; i < 3; i++)

System::Console::Write(" masl [" + i.ToString() + "]= " +

mas1[i].ToString());

System::Console::WriteLine ();

float *pMas2= new float [3]; // Массив в неуправляемой куче

*pMas2= 2.1; *(pMas2+1)= 2.2; *(pMas2+2)= 2.3;

for (int i= 0; i < 3; i++)

System::Console::Write(" pMas2 ["+i.ToString()+ "]=" +

pMas2[i].ToString());

delete pMas2;

}

Результат:

masl [0]= 1,1 masl [1]= 1,2 masl [2]= 1,3

pMas2 [0]= 2,1 pMas2 [1]= 2,2 pMas2 [2]= 2,3

C++/CLI. В примере 4.5.1 созданы два одномерных массива с плавающей точкой на языке C++/CLI в соответствии с правилами, приведёнными в начале этого раздела, с инициализацией и без инициализации членов массивов.

Один массив размещён в стеке, другой - в неуправляемой куче.

Пример 4.5.2 иллюстрирует создание и инициализацию массива в языках Java и C#.