Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование программ и программирование на С++ Часть 1. Структурное.pdf
Скачиваний:
18
Добавлен:
15.11.2022
Размер:
3.8 Mб
Скачать

14. ССЫЛКИ

Ссылка - это синоним имени объекта, указанного при инициали­ зации ссылки.

Формат объявления ссылки

тип & имя =имя_объекта;

переменной

int

х;

//

определение

int&

sx=x;

//

определение

ссылки на

//переменную х

CR='\n' //определение ссылки на

const

char&

//константу

 

 

 

Правила работы со ссылками:

-переменная-ссылка должна явно инициализироваться при ее описании, если она не является параметром функции, не описана как extern или не ссылается на поле класса;

-после инициализации ссылке не может быть присвоено другое значение;

-не существует указателей на ссылки, массивов ссылок и ссы­ лок на ссылки;

-операция над ссылкой приводит к изменению величины, на которую она ссылается.

Ссылка не занимает дополнительного пространства в памяти, она является просто другим именем объекта.

#include<iostream.h> void main()

{

int i=123; int& si=i;

cout<<"\ni="<<i<<" si="<<si;

i=456;

cout<<"\ni="<<i<<" si="<<si; i=0;

cout<<"\ni="<<i<<" si="<<si;

Выведется: i=123 si=123 i=456 si=456

i=0 si=0

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

&имя_ма ссива. int а [100];

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

int k=sizeof(a);

/*вычисление количества элементов массива*/ int n=sizeof(a)/sizeof(а[0]);

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

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

Имя массива является указателем-константой, значением кото­ рой служит адрес первого элемента массива, следовательно, к нему применимы все правила адресной арифметики, связанной с указате­

лями. Запись имя_массива [индекс] - это выражение с двумя

операндами: имя массива и индекс. Имя_массива - это указательконстанта, а индекс определяет смещение от начала массива. Ис­ пользуя указатели, обращение по индексу можно записать следую­ щим образом: * (имя_массива+индекс) .

for(int

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

//печать массива

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

 

/*к имени

(адресу) массива добавляется кон­

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

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

ной, а * (а+1) - нет.

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

int

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

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

int*

па=а;

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

массив из

100 элементов*/

int

b

= new int[100];

Многомерный массив - это массив, элементами которого служат массивы. Например, массив с описанием i n t а [ 4 ] [ 5 ] - это массив из четырех указателей типа i n t * , которые содержат адреса одно­ мерных массивов из пяти целых элементов (рис. 10).

 

 

 

 

 

 

*(а + 1) - адрес строки

 

 

 

 

 

 

массива с номером 1

 

0

I

2

3

4

*(*(а + 1) + 1 ) - значение

типа *int

0

I

ъ

'3

4

элемента, у которого

0

1

2

3

4

 

индексы строки и столбца

 

0

1

2

3

4

 

равны 1

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

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

инициализации одномерных массивов.

элементы массива

//лроинициализированы

все

int а [3][4]

= {{11,22,33,44}, {55,66,77,88},

{99,110,120,130}};

 

 

 

 

 

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

int b [3][4]

= {{1},{2},{3}};

//лроинициализированы все

элементы массива

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

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

а [ 1 ] [ 1 ]

- доступ с помощью индексированных переменных;

* (* (а +

1 ) +1)

- доступ к этому же элементу с помощью указателей

(см. рис.

10).

 

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

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

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

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

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

должны быть полностью определены.

 

 

//в ы д е л е н и е

ди н ам и ч еско й

пам яти

 

1 0 0 * s i z e o f ( i n t ) б ай т

 

 

 

i n t *

а =

new

i n

t [1 0 0 ];

 

 

//в ы д е л е н и е

д и н ам и ч еской

пам яти

 

1 0 * s i z e o f ( d o u b l e ) б ай т

 

 

 

d o u b le *

b =

 

new

d o u b l e [1 0 ] ;

 

/ /у к а з а т е л ь

 

на

м асси в

и з

4 эл ем ен то в

ти па lo n g

l o n g (* 1 а ) [ 4 ] ;

 

 

 

 

//в ы д е л е н и е

 

д и н ам и ч еской

пам яти

 

2 * 4 * s i z e o f ( l o n g ) б ай т

 

 

 

l a = n e w [ 2 ] [ 4 ] ;

 

 

 

 

/ /д р у г о й

сп о со б

вы делени я

п ам яти под

двумерный

//м а с с и в

 

 

 

 

 

 

 

 

in t * *

m a tr

=

( in t* * )

new

i n t [ 5 ] [ 1 0 ] ;

 

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

нии памяти с помощью операции d e l e t e .

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

е с л и а а д р е с у е т е г о н а ч а л о * /

d e l e t e []

а ;

d e l e t e []

b ;

d e l e t e []

l a ;

Если квадратных скобок нет, то сообщение об ошибке выдавать­

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

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

#i n c l u d e < io s tr e a m .h >

#i n c l u d e < s t r i n g . h >

#i n c l u d e < io s tr e a m .h >

# i n c l u d e < s t d l i b . h>

 

v o id m a in ()

 

{

 

 

i n t

n ,m ;

//р а з м е р н о с т ь матрицы

i n t

i , j ;

 

cout«"\nEnter n";

количества

строк

cin»n;

//ввод

cout«"\nEnter m";

количества

столбцов

cin»m;

//ввод

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

//строки

int* [n];

 

int** matr = new

 

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

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

 

 

 

matr[i] = new int [m];

 

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

 

 

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

 

 

 

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

= rand()%10);

 

matr[i][j]

 

//печать сформированной матрицы for(i=0;i<n;i++)

{

for(j=0;j<m;j++) cout«matr[i] [j]«,f

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

}

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

cout«M\nEnter к"; cin»k;

//формирование новой матрицы int** temp = new int*[n-l]; for(i=0;i<n;i++)

temp[i]=new int [m] ;

//заполнение новой матрицы int t; for(i=0,t=0;i<n;i++)

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

if(i!=k)

 

f o r ( j = 0 ; j < m ; j + + )

 

t e m p [ t ] [j ] = m a t r [ i ] [j ]

 

t+ + ;

 

}

//у д а л е н и е

ст а р о й матрицы

 

f o r ( i = 0 ; i < n ; i + + )

 

d e l e t e m a t r [ i ] ;

 

d e l e t e []

m a tr;

 

n - - ;

//у м ен ьш аем

к о л и ч е с т в о стр о к

//п е ч а т ь

новой матрицы

 

f o r (1 = 0 ;i< n ;i+ + )

{

f o r (j= 0 ;j< m ;j+ + )

c o u t< < te m p [ i] [ j ] « ,f c o u t « " \ n " ;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]