C++ - Урок 005. Указатели, Массивы и Циклы

C++, pointer, arrays, loops

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

char v[6];  // Массив из шести символов

Таким образом можно объявить указатель на символ:

char* p; // указатель на символ

В объявлении, [] означают массив, тогда как * означает указатель. Индексация массива начинается с 0, таким образом массив v будет иметь шесть элементов, от v[0] до v[5] . Размер массива должен быть константным выражением. Переменная указателя может содержать адрес объекта соответствующего типа.

char∗ p = &v[3]; // p указывает на четвёртый элемент массива v
char x = ∗p; // *p является объектом, на который указывает p

В выражении унарный префикс * означает "содержимое чего-либо", тогда как унарный префикс & означает "адрес чего-либо". Представим результат инициализации графически:

Рассмотрим копирование десяти элементов одного массива в другой:

void copy_fct()
{
    int v1[10] = {0,1,2,3,4,5,6,7,8,9};
    int v2[10];  // Массив для копируемых элементов

    for (auto i=0; i!=10; ++i) // копируем элементы
        v2[i]=v1[i];
}

Это for выражение может быть прочитано как "Устанавливаем I в 0 и, инкрементируя i, копируем элементы массива до тех пор, пока i не станет равно 10. Инкрементирование означает добавление 1 и выражается оператором ++. C++11 также позволяет использовать синтаксис for для контейнеров, что делает код более простым и чистым.

void print()
{
    int v[] = {0,1,2,3,4,5,6,7,8,9};
    for (auto x : v)
        cout << x << '\n'; // Для каждого x в массиве v

    for (auto x : {10,21,32,43,54,65})
        cout << x << '\n';
}

Первый range-for-statement может быть прочитан как "каждый элемент массива, с первого до последнего, копируется в x и печатается на экране". Заметьте, что мы не указываем границу массива, когда инициализируем его списком. range-for-statement может использоваться для любых последовательностей элементов.

Если вы не хотите копировать значения из массива v в переменную x, то возьмите элементы по ссылке:

void increment()
{
    int v[] = {0,1,2,3,4,5,6,7,8,9};
    for (auto& x : v)
        ++x;
}

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

T a[n];  // Массив n элементов T
T∗ p;    // указатель на T
T& r;    // ссылка на T
T f(A);  // функция, принимающая аргумент типа A и возвращающая результат типа T

Всегда старайтесь, чтобы указатель указывал на объект, чтобы разыменование было действительным. Когда мы не имеем объекта или нужно представить, что указатель ни на что не указывает, для этого используем nullptr. Только nullptr может использоваться для всех типов указателей.

double∗ pd = nullptr;
Link<Record>∗ lst = nullptr; // указатель на Link на Record
int x = nullptr; // ошибка: nullptr является указателем, а не целочисленным типом

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

int count_x(char∗ p, char x)
    // счётчик числа вхождений x в p[]
    // p является последовательность символов, которые завершаются 0
{
    if (p==nullptr) return 0;
    int count = 0;
    for (; ∗p!=0; ++p)
        if (∗p==x)
            ++count;
    return count;
}

Заметьте, что мы можем переместить указатель с помощью оператора ++ , чтобы он указывал на следующий элемент в массиве.

В устаревшем коде вместо nullptr использовались бы 0 или NULL. Однако использование nullptr устраняет потенциальную путаницу между целыми числами (такими как 0 или NULL) и указателями (такими как nullptr ).

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

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

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

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

PayPalYandex.Money
Timeweb

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

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
g
29 мая 2020 г. 14:32
glushchenkoin

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:40баллов,
  • Очки рейтинга-8
АС
26 мая 2020 г. 11:29
Артём Сун-Дун-Чан

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
МН
25 мая 2020 г. 11:33
Митя Нагибин

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
29 мая 2020 г. 13:00
Евгений Легоцкой

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

Думал так, но похоже что нет. {{ post.votes.likes.user.username }} Это же QuerySet будет, а не отдельный единственный объект {% for vote in post.votes %} {{ vote.user.username …
29 мая 2020 г. 11:43
Владислав Меленчук

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

А как получить имя пользователя, который поставил лайк? Думал так, но похоже что нет. {{ post.votes.likes.user.username }}
29 мая 2020 г. 6:30
Евгений Легоцкой

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

У меня работает. Исправлял в проекте, который приложен к статье. А что происходит в вашем коде, с учётом места вызова этого кода, я знать не могу ;) Дебажьте и добавляйте условия, кото…
МА
29 мая 2020 г. 6:27
Михаил А

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

QModelIndexList rowIndexes = ui->tableView->selectionModel()->selectedRows(); model->removeRows(rowIndexes.first().row(), rowIndexes.size()); model-&…
Сейчас обсуждают на форуме
РС
30 мая 2020 г. 15:41
Руслан Склюев

Минимальный размер Item

Здравствуйте, новичек в QML. Раньше у меня было несколько окон и минимальный размер считал так: minimumHeight: loGeneral.implicitHeight + 2 loGeneral.anchors.margins minimumWid…
S
РС
30 мая 2020 г. 11:49
Руслан Склюев

QML Как при нажатии на кнопку изменить название окна?

У меня три файла: 1. QML - это Loader и Window 2. QML вход в программу - страница Loader (там есть Switch) 3. QML - MainMenu. Мне нужно в (1), чтобы если на (2) Switch.enable, то …
ДК
29 мая 2020 г. 13:27
Джон Кофи

QMap<> какой ключ лучше

это ясно. Вопрос в том, как быстро мапа будет отрабатывать, если ключом будет QModelIndex. Какой параметр индекса возьмет за ключ. И вот насколько это будет медленнее или быстрее, чем QString пр…
ДК
29 мая 2020 г. 11:10
Джон Кофи

QModelIndex становится не действительным, но валидный

Привет. Есть проблема с индексом и для меня это чистая магия: Сначала, что делаю: на вьюхе есть редактируемые ячейки. Пользователь редактирует одну, потом внезапно решает не сохраниться и ш…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB