Evgenii Legotckoi
Evgenii Legotckoi6. Juli 2017 03:40

C++ - Tutorial 005. Zeiger, Arrays und Schleifen

Ein Array von char-Elementen kann wie folgt deklariert werden:

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

So können Sie einen Zeiger auf ein Zeichen deklarieren:

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

In der Deklaration bedeutet [] ein Array, während * einen Zeiger bedeutet. Die Array-Indizierung beginnt bei 0, sodass das v -Array sechs Elemente hat, von v[0] bis v[5]** . Die Arraygröße muss ein konstanter Ausdruck sein. Eine Zeigervariable kann die Adresse eines Objekts des entsprechenden Typs enthalten.

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

In einem Ausdruck bedeutet das unäre Präfix * "der Inhalt von etwas", während das unäre Präfix & "die Adresse von etwas" bedeutet. Stellen wir das Ergebnis der Initialisierung grafisch dar:


Ziehen Sie in Betracht, zehn Elemente von einem Array in ein anderes zu kopieren:

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];
}

Diese for-Anweisung kann gelesen werden als „I auf 0 setzen, und während ich i inkrementiere, die Elemente des Arrays kopieren, bis i gleich 10 ist. Inkrementieren bedeutet das Hinzufügen von 1 und wird durch den Operator ++ ausgedrückt. C+ Mit +11 können Sie auch die for-Syntax für Container verwenden, wodurch der Code einfacher und sauberer wird.

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';
}

Die erste Range-for-Anweisung kann gelesen werden als "jedes Element des Arrays, vom ersten bis zum letzten, wird nach x kopiert und auf dem Bildschirm ausgegeben". Beachten Sie, dass wir keine Array-Grenze angeben, wenn wir es mit einer Liste initialisieren. range-for-statement kann für jede Folge von Elementen verwendet werden.

Wenn Sie keine Werte aus dem Array v in die Variable x kopieren möchten, greifen Sie Elemente per Referenz:

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

Eine Deklaration mit einem unären &-Operator bedeutet einen Verweis auf. Eine Referenz ähnelt einem Zeiger, außer dass für den Zugriff auf Elemente keine Dereferenzierung des Zeigers erforderlich ist, d. h. die Verwendung des unären Präfixes *.

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

Versuchen Sie immer, den Zeiger auf das Objekt zeigen zu lassen, damit die Dereferenzierung gültig ist. Wenn wir kein Objekt haben oder vorgeben müssen, dass der Zeiger auf nichts zeigt, verwenden wir nullptr. Nur nullptr kann für alle Zeigertypen verwendet werden.

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

Daher muss häufig überprüft werden, ob das Argument tatsächlich ein Zeiger ist, der ein reales Objekt enthält.

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;
}

Beachten Sie, dass wir den Zeiger mit dem Operator ++ * bewegen können, um auf das nächste Element im Array zu zeigen.

Älterer Code würde 0 oder NULL anstelle von nullptr verwenden. Die Verwendung von nullptr beseitigt jedoch die potenzielle Verwechslung zwischen Ganzzahlen (wie 0 oder NULL) und Zeigern (wie nullptr ).

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken