Evgenii Legotckoi
Evgenii Legotckoi8 июля 2017 г. 15:31

C++ - Урок 006. Структуры

Одним из первых шагов в построении новых типов данных является организация данных в структуру, объединяющую несколько различных переменных с разными типами данных. Объявления структуры выполняется с помощью ключевого слова struct .

Например, объявим структуру Vector , в котором будет храниться указатель на начало массива элементов типа double и переменная с количеством этих элементов.

struct Vector {
    int sz;       // Число элементов
    double∗ elem; // указатель на элементы
};

Переменная типа Vector может быть объявлена в коде следующим образом:

Vector v;

Однако само по себе это объявление не имеет пользы, поскольку необходимо инициализировать эту структуру некоторым массивом элементов с заданным количеством элементов. Можем сделать это с помощью следующей функции.

void vector_init(Vector& v, int s)
{
    v.elem = new double[s]; // выделение памяти для массива элементов
    v.sz = s;
}

В данной функции в качестве аргументов передаётся ссылка на объект Vector и количество элементов, которым необходимо инициализировать этот вектор. Поскольку объект типа Vector передаётся как неконстантный объект, то мы можем модифицировать его.

Оператор new выделяет память в так называемом свободном хранилище (динамической памяти или по простому куче).

Простое использование Vector выглядит следующим образом:

double read_and_sum(int s)
    // чтение целых чисел из стандартного ввода в возврат их суммы, считаем s положительным 
{
    Vector v;
    vector_init(v,s); // выделяем память под s элементов для v
    for (int i=0; i!=s; ++i)
        cin>>v.elem[i]; // считываем данные в массив элементов

    double sum = 0;
    for (int i=0; i!=s; ++i)
        sum+=v.elem[i];  // Суммируем все элементы
    return sum;
}

Впереди ещё долгий путь до того, как Vector станет гибким и элегантным, как vector из стандартной библиотеки.

Для доступа к элементам структуры можно использовать точку ( dot . ), если используется доступ через имя или ссылку, или −>, если доступ используется через указатель. Например:

void f(Vector v, Vector& rv, Vector∗ pv)
{
    int i1 = v.sz; // доступ через имя
    int i2 = rv.sz; // доступ через ссылку
    int i4 = pv−>sz; // доступ через указатель
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84баллов,
  • Очки рейтинга4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42баллов,
  • Очки рейтинга-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47баллов,
  • Очки рейтинга-6
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 21:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 23:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 17:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 16:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 20:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
f
firstlunoxod15 февраля 2025 г. 13:46
Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
Дмитрий
Дмитрий3 февраля 2025 г. 16:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 января 2025 г. 19:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly3 января 2025 г. 12:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel17 августа 2023 г. 0:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

Следите за нами в социальных сетях