Evgenii Legotckoi
Evgenii Legotckoi6 июля 2017 г. 3:40

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

Массив элементов типа 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 хостинг.

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

Комментарии

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

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

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

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

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

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

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 11:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 14:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 8:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 7:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 11:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 6:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 3:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 октября 2024 г. 9:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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