- •Основные определения
- •Операции над массивами
- •Массивы и указатели
- •Варианты обращения к элементам массива
- •Примеры вывода элементов массива через указатель
- •Передача одномерного массива в функцию в качестве параметра
- •Способы передачи одномерного массива в качестве параметра
- •Массив указателей на функцию
- •Динамические одномерные массивы
- •Способы определения динамических одномерных массивов
- •Пример нахождения среднего значения элементов динамического массива
- •Перегрузка функций при работе с массивами
- •Шаблоны функций при работе с массивами
- •Поиск в массиве
- •Сортировка массивов
- •Сортировка обменом («пузырьковая» сортировка)
- •Сортировка одномерного массива по некоторому признаку
- •Сортировка вставкой
- •Сортировка выбором
- •Примеры
- •Нахождение номера первого вхождения числа y в массив Х
- •Поиск в массиве максимального элемента и его номера
- •Проверка элементов массива на некоторую закономерность
- •Построение элементов массива в соответствии с некоторой закономерностью.
- •Нахождение количества положительных элементов между максимальным и минимальным элементами целочисленного массива
- •Нахождение суммы элементов вещественного массива, расположенных правее последнего отрицательного элемента
for (int i=0; i<n; i++) {cout << setw(8);
cout << Random_array[i];
if (!((i+1) %5)) cout << endl; //вывод элементов массива по 5 в строке
}
cout << endl; _getch(); return 0;
}
В этом случае элементы массива будут расположены четкими столбцами.
Массивы и указатели
Массивы и указатели тесно связаны. Имя массива является указателем-
константой на его первый (нулевой) элемент.
Запись имя_массива[индекс] – есть выражение с двумя операндами: имя_массива – константный указатель – адрес начала массива в памяти; индекс – определяет смещение от начала массива. Тогда действие бинарной операции [ ] можно объяснить так:
*(имя_массива + индекс).
int a [10]; |
|
//a – адрес массива (указатель-константа) |
(a+i) == &a[i] |
// (a+i) = (a + i *sizeof (int) ); |
|
*(a+i) == a[i]; |
//нельзя писать a++ или а-- |
|
|
|
// так как а – указатель-константа и его нельзя изменять |
int *pa, ai; |
|
//инициализация указателя pa адресом массива а |
pa= &a[0]; |
|
|
pa=a; |
|
// нельзя писать a=pa; |
|
|
//так как а – указатель-константа и его нельзя изменять |
(pa+1) == &a[1]; |
// и можно писать ра++ или pa-- |
|
(pa+i) == &a[i]; |
||
*(pa+i) == pa[i] *(pa+i) == a[i]; pa[i] == a[i]; |
||
ai= *pa; |
ai |
равно a[0]; |
Обратите внимание:
sizeof a равно 40, но sizeof pa равно 4 !!! (размер указателя)
Правило:
Имя массива и индексное выражение можно записать как ссылку и смещение и наоборот:
(a+i) есть &a[i] *(a+i) == a[i] ==i[a] !!!
имя массива == &имя массива == &имя массива[0]
Варианты обращения к элементам массива
int a[ ]={10, 20, 30, 40, 50, 60}; int main()
{
int i, *p;
//1 |
(i=0; |
i<6; |
i++) |
|
for |
6 |
|||
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
||||
printf ("a[%d]=%d; %c", i, a[i], (i==2)? '\n': ' '); printf("\n\n");
//2
for (p=&a[0]; p<=&a[5]; p++)
printf (" *p: %d; %c", *p, ((p==&a[2])? '\n': ' ')); printf("\n\n");
for (p=a+5; |
p>=a; |
p--) |
|
|
|
|
printf (" *p: %d; %c", *p, (p==a+3)? '\n': ' '); |
|
|||||
printf("\n\n"); |
|
|
|
|
|
|
for (p=&a[0], i=0; |
i<6; |
i++) |
|
|
|
|
printf (" *(p++): %d; %c", *(p++), (p==&a[2])? '\n': ' '); |
||||||
|
|
|
|
//равносильно |
*р++ |
|
printf("\n\n"); |
|
//Внимание!!! (*p)++ |
увеличивает значение a[i], |
|||
|
|
|
|
|
||
//3 |
p+i<=a+5; |
i++) |
// или |
for (p=a, i=0; p+i<=a+5; |
||
for (p=a, i=0; |
||||||
p++) |
|
|
%c", i, *(p+i), (i==2)? '\n': ' '); |
|||
printf ("*(p+%d) = %d\t |
||||||
printf("\n\n"); |
|
|
|
|
|
|
//4
for (p=&a[0], i=0; i<6; i++)
printf ("p[%d] = %d; %c", i, p[i], (i==2)? '\n': ' '); printf("\n\n");
for (p=a+5, i=0; i<=5; i++)
printf ("p[-%d] = %d; %c", i, p[-i], (i==2)? '\n': ' '); printf("\n\n");
//5
for (p=a+5; p>=a; p--)
printf (" a[p-a]: %d; %c", a[p-a], (p==(a+3)) ? '\n': ' '); printf("\n\n");
_getch(); return 0;
}
Результаты вывода:
a[0]=10; a[1]=20; a[2]=30; a[3]=40; a[4]=50; a[5]=60;
*p: 10; |
*p: 20; |
*p: 30; |
*p: 40; |
*p: 50; |
*p: 60; |
*p: 60; |
*p: 50; |
*p: 40; |
*p: 30; |
*p: 20; |
*p: 10; |
*(p++): |
10; |
*(p++): 20; |
|
*(p++): 30; |
|
|
||
*(p++): |
40; |
*(p++): 50; |
|
*(p++): 60; |
|
|
||
*(p+0) |
= |
10 |
*(p+1) |
= |
20 |
*(p+2) |
= |
30 |
*(p+3) |
= |
40 |
*(p+4) |
= |
50 |
*(p+5) |
= |
60 |
p[0] = 10; p[1] = 20; p[2] = 30; p[3] = 40; p[4] = 50; p[5] = 60;
p[-0] |
= |
60; |
p[-1] |
= 50; |
p[-2] = 40; |
|
p[-3] |
= |
30; |
p[-4] |
= 20; |
p[-5] = 10; |
7 |
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
||||||
a[p-a]: 60; a[p-a]: 50; a[p-a]: 40; a[p-a]: 30; a[p-a]: 20; a[p-a]: 10;
Примеры вывода элементов массива через указатель
1. Вывод элементов массива через указатель
int main()
{int intarray[] = { 31, 54, 77, 52, 93 }; int* ptrint;
ptrint = intarray; for(int j=0; j<5; j++)
cout << *(ptrint++) << endl;
//вывод значений массива через изменение указателя
_getch(); return 0;
}
Результат:
31
54
77
52
93
Тот же результат получим, если при выводе значений на экран в цикле будет записан
оператор: cout << *ptrint++ << endl; или: cout << *(ptrint +j) << endl;
2. А теперь в операторе вывода расставим скобки по-другому:
int main()
{int intarray[] = { 31, 54, 77, 52, 93 }; int* ptrint;
ptrint = intarray; for(int j=0; j<5; j++)
cout << (*ptrint)++ << endl;
//вывод измененного значения первого элемента
_getch(); return 0;
}
Результат будет иным:
31
32
33
34
35
3. Определить результат вывода***: |
|
|
|
|
|
|
|
|
|
|
||||
int a[ ]={0, 1, 2, 3, 4}; |
|
|
|
|
|
|
|
|
|
|
||||
int *p[ ] = {a, a+1, a+2, a+3, a+4}; |
|
|
|
|
|
|
|
|
|
|
||||
int **pp = p; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{printf("%p |
%d\n", a, *a); |
|
|
|
|
|
//адрес а, 0 |
|
||||||
printf("%p |
%p |
%d\n", p, *p, **p); |
// адрес p, адрес а, |
0 |
||||||||||
printf("%p |
%p |
%d\n", pp, *pp, **pp); |
// адрес p, адрес а, |
0 |
||||||||||
|
|
pp |
|
|
|
|
|
|
|
|
|
|
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
0 |
1 |
|
2 3 |
|
4 |
|
|
|
|
|
|
|
|
|
|||||||||||||
pp++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%d |
%d |
%d\n", pp-p, *pp-a, **pp); |
|
|
|
|
|
|
// 1, |
1, |
|
1 |
|
|
|
|
||||||||||||||
|
|
pp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
1 |
|
2 |
|
|
3 |
|
4 |
|
|
|
|
|
|
|
|
|
|||||||||
*pp++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%d |
%d |
%d\n", pp-p, *pp-a, **pp); |
|
|
|
|
|
|
// 2, |
2, |
|
2 |
|
|
|
|
||||||||||||||
|
|
pp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
0 |
|
|
1 |
|
|
2 |
|
|
3 4 |
|
|
|
|
|||||||||||||
*++pp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%d |
%d |
%d\n", pp-p, *pp-a, **pp); |
|
|
|
|
|
|
// 3, |
3, |
|
3 |
|
|
|
|
||||||||||||||
|
|
pp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
++*pp; |
|
|
|
|
|
|
|
|
0 |
|
1 |
|
2 |
|
|
|
3 |
4 |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%d |
%d |
%d\n", pp-p, *pp-a, **pp); |
|
|
|
|
|
|
// 3, |
4, |
|
4 |
|
|
|
|
||||||||||||||
pp p
a |
0 |
1 |
2 |
3 |
4 |
pp=p; **pp++;
printf("%d %d %d\n", pp-p, *pp-a, **pp); // 1, 1, 1 pp
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
|
|
9 |
|||||||
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
