Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Одномерные массивы и указатели




 

При определении массива ему выделяется память. После этого имя массива воспринимается как константный указатель того типа, к которому относятся элементы массива. Исключением является использование операции sizeof(имя_массива) и операции &имя_массива.

 

int a[100];

 

/*определение количества занимаемой массивом памяти, в нашем случае это 4*100=400 байт*/

int k=sizeof(a);

 

/*вычисление количества элементов массива*/

int n=sizeof(a)/sizeof(a[0]);

 

Результатом операции & является адрес нулевого элемента массива:

 

имя_массива==&имя_массива=&имя_массива[0]

 

Имя массива является указателем-константой, значением которой служит адрес первого элемента массива, следовательно, к нему применимы все правила адресной арифметики, связанной с указателями. Запись имя_массива[индекс] это выражение с двумя операндами: имя массива и индекс. Имя_массива – это указатель-константа, а индекс определяет смещение от начала массива. Используя указатели, обращение по индексу можно записать следующим образом: *(имя_массива+индекс).

 

for(int i=0;i<n;i++) //печать массива

cout<<*(a+i)<<" ";

/*к имени (адресу) массива добавляется константа i и полученное значение разыменовывается*/

 

Так как имя массива является константным указателем, то его невозможно изменить, следовательно, запись *(а++) будет ошибочной, а *(а+1) – нет.

Указатели можно использовать и при определении массивов:

 

int a[100]={1,2,3,4,5,6,7,8,9,10};

 

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

int* na=a;   

 

/*выделили в динамической памяти место под массив из 100 элементов*/

int b = new int[100];

Многомерные массивы и указатели

 

Многомерный массив это массив, элементами которого служат массивы. Например, массив с описанием int a[4][5] – это массив из 4 указателей типа int*, которые содержат адреса одномерных массивов из 5 целых элементов (см. рис.3).

Рис. 6. Выделение памяти под массив, элементами которого являются массивы

Инициализация многомерных массивов выполняется аналогично одномерным массивам.

 

//проинициализированы все элементы массива

int a[3][4] = {{11,22,33,44}, {55,66,77,88}, {99,110,120,130}};

 

//проинициализированы первые элементы каждой строки

int b[3][4] = {{1},{2},{3}};

 

//проинициализированы все элементы массива

int c[3][2]={1,2,3,4,5,6};

 

Доступ к элементам многомерных массивов возможен и с помощью индексированных переменных и с помощью указателей:

a[1][1] – доступ с помощью индексированных переменных,

*(*(a+1)+1) – доступ к этому же элементу с помощью указателей (см. рис.3).

 

Динамические массивы

 

Операция new при использовании с массивами имеет следующий формат:

new тип_массива

 

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

//выделение динамической памяти 100*sizeof(int) байт

int* a = new int[100];

 

//выделение динамической памяти 10*sizeof(double) байт

double* b = new double[10];

 

//указатель на массив из 4 элементов типа long

long(*la)[4];

 

//выделение динамической памяти 2*4*sizeof(long) байт

lа = new[2][4];

 

//другой способ выделения памяти под двумерный массив

int** matr = (int**) new int[5][10];

 

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

 

/*освобождает память, выделенную под массив, если а адресует его начало*/

delete[] a;

delete[] b;

delete[] la;

 

Если квадратных скобок нет, то сообщение об ошибке выдаваться  не будет, но помечен как свободный будет только первый элемент массива, и остальные ячейки окажутся недоступными для дальнейшего использования («мусор»).

 

//Удалить из матрицы строку с номером K

#include <iostream.h>

#include <string.h>

 

#include <iostream.h>

#include <stdlib.h>

void main()

{

int n,m; //размерность матрицы

int i,j;

cout<<"\nEnter n";

cin>>n;  //ввод количества строки

cout<<"\nEnter m";

cin>>m;  //ввод количества столбцов

    

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

int** matr = new int* [n];

 

//выделение памяти под элементы матрицы

for(i=0;i<n;i++)

    matr[i] = new int [m];

 

//заполнение матрицы

for(i=0;i<n;i++)

for(j=0;j<m;j++)

    matr[i][j] = rand()%10);

 

//печать сформированной матрицы

for(i=0;i<n;i++)

{

    for(j=0;j<m;j++)

         cout<<matr[i][j]<<" ";

    cout<<"\n";//переход на следующую строку

}

 

//удаление строки с номером k

int k;

cout<<"\nEnter k";

cin>>k;

 

//формирование новой матрицы

int** temp = new int*[n-1];

for(i=0;i<n;i++)

    temp[i]=new int[m];

 

//заполнение новой матрицы

int t;

for(i=0,t=0;i<n;i++)

/*если номер строки отличен от k, переписываем строку в новую матрицу*/

    if(i!=k)

    {

         for(j=0;j<m;j++)

              temp[t][j] = matr[i][j];

         t++;

    }

        

//удаление старой матрицы

for(i=0;i<n;i++)

    delete matr[i];

delete[] matr;

 

n--; //уменьшаем количество строк

 

//печать новой матрицы

for(i=0;i<n;i++)

{

    for(j=0;j<m;j++)

         cout<<temp[i][j]<<" ";

    cout<<"\n";

}

}

Символьная информация и строки

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 296.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...