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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

Примеры:

int a[100];

int k=sizeof(a);// результатом будет 4*100=400 (байтов).

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;//поставили указатель на уже определенный массив

int b=new int[100];//выделили в динамической памяти место под массив из 100 элементов

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

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

 

*(a+1) – адрес строки массива с номером 1
int **a

 
Элементы типа *int

 


 

Рис.

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

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) – доступ к этому же элементу с помощью указателей (см. рис.).

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

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

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

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

Примеры:

1. int *a=new int[100];//выделение динамической памяти размером 100*sizeof(int) байтов double *b=new double[10];// выделение динамической памяти размером 10*sizeof(double) байтов

2. long(*la)[4];//указатель на массив из 4 элементов типа long

lа=new[2][4];//выделение динамической памяти размером 2*4*sizeof(long) байтов

3. int**matr=(int**)new int[5][10];//еще один способ выделения памяти под двумерный //массив

4. int **matr;

matr=new int*[4];//выделяем память под массив указателей int* их n элементов

for(int I=0;I<4;I++)matr[I]=new int[6];//выделяем память под строки массива

 

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

Примеры:

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

delete[]b;

delete[] la;

for(I=0;I<4;I++)delete [] matr[I];//удаляем строки

delete [] matr;//удаляем массив указателей

Пример

Удалить из матрицы строку с номером 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";

       }

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

       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++)

                   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";

       }

}



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 44; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.190.232 (0.01 с.)