Массивы в языке С++

Массивы служат для хранения множества однотипных объектов (переменные, указатели, объекты классов, структуры и т.д.)


	const int size = 5;     // Константную переменную можно использовать в качестве размера массива
    int ar[size];           // Массив на 5 элементов
    int ar[5];              // Массив на 5 элементов
    int ar[5]{0};           // {0, 0, 0, 0, 0} Массив на 5 элементов инициализированных нулями
    int ar[5]{2};           // {2, 0, 0, 0, 0} Массив на 5 элементов инициализированных нулями, первый элемент 2
    int ar[5]{2,7};         // {2, 7, 0, 0, 0} Массив на 5 элементов инициализированных нулями, первые элементы 2 и 7
    int ar[]{1, 4, 9, 16, 25}; // {1, 4, 9, 16} Массив с явной инициализацией без указания размера
    std::cout << sizeof(ar) / sizeof(int) << std::endl; // 5 Можно узнать размер статического массива
    std::cout << std::size(ar) << std::endl; // 5 Размер статического массива через std::size()
    for(int i = 0; i < size; i++){       // Перебор элементов массива
        std::cout << ar[i] << std::endl; // Печать элементов массива
    }
    
    int ar[2][3];   // Двумерный массив из двух строк (row) и трех столбцов (column)
    int ar[2][3]={  // Двумерный массив с явной инициализацией
        {1, 2, 3},
        {4, 5, 6} 
    };
    int ar[][3]={   // Идентично предыдущему объявлению массива ar. Первую размерность массива можно не указывать
        {1, 2, 3},
        {4, 5, 6,}, // Можно ставить запятые после последней цифры или скобки, для удобства добавления новых строк и столбцов
     };
     int ar[][3]={1, 2, 3, 4, 5, 6,};  // Идентично предыдущим объявлениям массива ar. Вложенные скобки {} необязательны. 
    
	int *ar = new int[5];        // Массив на 5 элементов
    int *ar = new int(5);        // То же самое. Размер массива без инициализации можно указать в скобках
    int *ar = new int[5]{2};     // {2, 0, 0, 0, 0}
    int *ar = new int[5]{2, 7};  // {2, 7, 0, 0, 0}

Передача массива в функцию

1) Массив передается в функцию как указатель.
2) Изменение элементов массива переданного в функцию будут доступны и за пределами функции.
3) Размер массива, даже если он статический нельзя определить в функции. Размер массива можно передавать в функцию как параметр (или хранить в глобальной внешней переменной, которая будет доступна из функции)

#include <iostream>                   // cout

void func(int *arr, int size){        // Функция принимающая массив
    for(int i = 0; i < size; i++){    // Перебираем элементы массива
        arr[i] = i * i;               // Присваиваем значения элементам массива
    }
}

int main(){
    int ar_size = 5;                  // Размер массива
    int ar[ar_size];                  // Создаем массив
    func(ar, ar_size);                // Вызываем функцию и передаем в нее массив
    for(int i = 0; i < ar_size; i++){ // Перебираем элементы массива
        std::cout << ar[i] << ' ';    // 0 1 4 9 16 Выводим значения массива
    }
}

Возвращение массива из функции

1) Если массив передавался в функцию как параметр, возвращать его не нужно. Изменение элементов массива в функции будут доступны и за пределами функции.
2) Статический массив, созданный внутри функции, возвращать нельзя - при выходе из функции память выделенная под массив может быть освобождена и использована в других целях.
3) Можно вернуть из функции статический массив созданный внутри нее с ключевым словом static. Переменные объявленные как static существуют все время выполнения программы.
4) Из функции можно вернуть динамический массив созданный с помощью new, память выделенная под него освободится только вызовом delete

#include <iostream>                   // cout

int * func(int size){                 // Функция возвращающая массив
    int * arr = new int[size];        // Создаем массив в функции
    // static int arr[5];             // Размер статического массива нужно указывать явно, или задавать из константной переменной или макроподстановкой
    for(int i = 0; i < size; i++){    // Перебираем элементы массива
        arr[i] = i * i;               // Присваиваем значения элементам массива
    }
    return arr;                       // Возвращаем массив
}

int main(){
    int ar_size = 5;                  // Размер массива
    int *ar = func(ar_size);          // Вызываем функцию создающую и возвращающую массив
    for(int i = 0; i < ar_size; i++){ // Перебираем элементы массива
        std::cout << ar[i] << ' ';    // 0 1 4 9 16 Выводим значения массива
    }
}

Двумерный статический массив

двумерный массив С++

#include <iomanip>  // std::setw
#include <iostream> // std::cout
int main(){
    const int ROW = 3, COL = 4; // Размер статического массива
    char ar[ROW][COL];          // Cоздаем массив ar
    std::cout << "ar = " << (void *)ar << "\n"; // Вывод адреса массива
    for(int m = 0; m < ROW; m++){               // Перебор строк
        std::cout << "ar[" << m << "] = " << (void *)ar[m] << "\n"; // Вывод адреса строк
        for(int n = 0; n < COL; n++){ // Перебор столбцов
            ar[m][n] = m * COL + n;   // Присваивание значения элементу
            std::cout << "ar[" << m << "][" << n << "] = " << std::setw(2) << (int)ar[m][n] << "  &ar[" << m << "][" << n << "] = " << (void *)&ar[m][n] << "\n"; //вывод значения и адреса элемента
        }
    }
    return 0;
}
/* Вывод программы
ar = 0x61fe74
ar[0] = 0x61fe74
ar[0][0] = 0  &ar[0][0] = 0x61fe74
ar[0][1] = 1  &ar[0][1] = 0x61fe75
ar[0][2] = 2  &ar[0][2] = 0x61fe76
ar[0][3] = 3  &ar[0][3] = 0x61fe77
ar[1] = 0x61fe78
ar[1][0] = 4  &ar[1][0] = 0x61fe78
ar[1][1] = 5  &ar[1][1] = 0x61fe79
ar[1][2] = 6  &ar[1][2] = 0x61fe7a
ar[1][3] = 7  &ar[1][3] = 0x61fe7b
ar[2] = 0x61fe7c
ar[2][0] = 8  &ar[2][0] = 0x61fe7c
ar[2][1] = 9  &ar[2][1] = 0x61fe7d
ar[2][2] = 10 &ar[2][2] = 0x61fe7e
ar[2][3] = 11 &ar[2][3] = 0x61fe7f
*/

Размещение массива в памяти
Размещение массива в памяти С++

Двумерный динамический массив


#include <iomanip>  // std::setw
#include <iostream> //std::cout
using namespace std;
int main(){
    int row = 3, col = 4;          // Размер массива
    char **ar = new char*[row];    // Создаем указатели на строки (массив в котором будут содержаться массивы)
     cout << "ar = " << (void *)ar << endl;
     for(int m = 0; m < row; m++){ // Перебор строк
         ar[m] = new char[col];    // Создаем столбцы
     }
     for(int m = 0; m < row; m++){ // Перебор строк
         cout << "ar[" << m << "] = " << (void *)ar[m] <<endl; // Вывод адреса строки
         for(int n = 0; n < col; n++){ // Перебор столбцов
             ar[m][n] = m * col + n;   // Присваивание значения элементу
             cout << "ar[" << m << "][" << n << "] = " << setw(2) << (int)ar[m][n] << " addr = " << (void *)&ar[m][n] << endl; // Вывод значения и адреса элемента
         }
    }
    for(int m = 0; m < row; m++){      // Перебор строк
         delete [] ar[m];              // Освобождаем память занятую строками
    }
    delete [] ar;    // Освобождаем память выделенную под указатели на строки
 return 0;
}
/* Вывод программы
ar = 0x970730
ar[0] = 0x970758
ar[0][0] = 0  &ar[0][0] = 0x970758
ar[0][1] = 1  &ar[0][1] = 0x970759
ar[0][2] = 2  &ar[0][2] = 0x97075a
ar[0][3] = 3  &ar[0][3] = 0x97075b
ar[1] = 0x970778
ar[1][0] = 4  &ar[1][0] = 0x970778
ar[1][1] = 5  &ar[1][1] = 0x970779
ar[1][2] = 6  &ar[1][2] = 0x97077a
ar[1][3] = 7  &ar[1][3] = 0x97077b
ar[2] = 0x970798
ar[2][0] = 8  &ar[2][0] = 0x970798
ar[2][1] = 9  &ar[2][1] = 0x970799
ar[2][2] = 10 &ar[2][2] = 0x97079a
ar[2][3] = 11 &ar[2][3] = 0x97079b
*/

Размещение массива в памяти
Размещение динамического массива в памяти С++

Адресная арифметика с двумерными массивами

Двумерный массив представляет собою указатель на блок данных в памяти (в случае динамического массива блоки памяти). Можно обращаться к его элементам можно как к одномерному массиву или указателю с использованием адресной арифметики. Следующие выражения идентичны:


 ar[m][n] <=> *(ar[m] + n) <=> *(*(ar + m) + n)
&ar[m][n] <=>   ar[m] + n  <=>   *(ar + m) + n
В этих выражениях ar + m равно адресу где лежит адрес строки, а ar[m] и *(ar+m) равны адресу строки (нулевого элемента в строке). Эти адреса совпадают для статического массива и могут отличаться для динамического.
2023-10-23



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Массивы в языке С++