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 ).