it-swarm.com.de

Was ist ** in C++?

Ich habe etwas Code gesehen sowie einige Fehler, die von meinem Compiler generiert wurden und vor der Variablen ein '**'-Token haben (zB ** Variablenname nicht referenziert-- oder etwas, an das ich mich nicht genau erinnern kann). Ich bin mir ziemlich sicher, dass dies mit Zeigern zusammenhängt, wenn ich vermute, es sieht so aus, als würde es zweimal versuchen, dereferenziert zu werden. '**' ist ziemlich unlesbar. Kann mich jemand auf eine gute Website/Dokumentation verweisen oder würde es jemand hier erklären?

Vielen Dank.

Tolle Antworten. Wenn ich hinzufügen kann, in welchen Situationen ist es sinnvoll, einen Zeiger auf einen Zeiger zu haben? Sollten Sie nicht einfach den ursprünglichen Zeiger verwenden, anstatt einen weiteren Zeiger auf den ursprünglichen Zeiger zu erstellen?

36
agscala

** ist eigentlich nicht nur ein Zeiger auf einen Zeiger (wie in der Deklaration), sondern auch die Dereferenzierung einer Dereferenzierung (in einer Anweisung).

Es wird häufig in C verwendet, das nicht die & Notation für Referenzen hat, z. So aktualisieren Sie einen Rückgabewert, der ein Zeigertyp ist:

int alloc_foo(struct foo **foo_ret)
{
    *foo_ret = malloc(sizeof(struct foo));
    return 1; /* to indicate success; return value in foo_ret */
}
44
Antti Huima

Sie können die Signatur für main () erkennen:

int main(int argc, char* argv[])

Folgendes ist gleichwertig:

int main(int argc, char** argv)

In diesem Fall ist argv ein Zeiger auf ein Array von char *.

In C ist der Indexoperator [] nur eine weitere Möglichkeit, Zeigerarithmetik auszuführen. Zum Beispiel,

foo[i]

erzeugt den gleichen Code wie

*(foo + i)
29
Parappa

Es ist kein **-Token. Es ist einfach ein *-Token gefolgt von einem anderen *-Token. In Ihrem Fall haben Sie einen Zeiger auf einen Zeiger, und er wird zweimal dereferenziert, um das Richtige zu erhalten.

11
Rob Kennedy

** ist ein Zeiger auf einen Zeiger.

Es kann sich dabei um eine Matrix (Array von Arrays) oder um ein Array von Strings (Char-Array) usw. handeln.

8
Can Berk Güder

Es ist eine doppelte Dereferenzierung.

int i = 3;
int* ptr_to_i = &i;
int** ptr_to_ptr_to_i = &ptr_to_i;

std::cout << **ptr_to_ptr_to_i << std::endl;

Drucke 3.

6
Paul Beckingham

Ich wollte nur einige der Verwendungen für einen Zeiger auf einen Zeiger unterstreichen. Die meisten dieser sind von anderen Beiträgen berührt, aber ich dachte, Wiederholung könnte helfen.

  • Es erlaubt einem Aufseher, Modify einen Zeiger, der dem Anrufer gehört. Zum Beispiel könnte man einen Zeiger auf einen Zeiger auf den Anfang einer Zeichenfolge übergeben, und der Aufseher könnte den Zeiger zeigen, der jetzt auf eine Position innerhalb der Zeichenfolge zeigt, an der ein bestimmtes Zeichen auftritt.

  • Da Arrays zu Zeigern degradiert werden (und Zeiger als Arrays behandelt werden können), wird häufig ein Zeiger auf einen Zeiger angezeigt, wenn Sie Folgendes haben:

    • Ein Zeiger auf ein Array. Dies ist eine Verallgemeinerung des obigen Falls, da eine "Zeichenfolge" (ohnehin eine C-Zeichenfolge) nur ein Array von chars ist.

    • Ein Array von Zeigern. Sie haben beispielsweise ein Array von Zeigern auf Objekte, das Polymorphismus zulässt, oder ein Array von Zeigern, um Objekte auszuwählen, die in einer anderen Sammlung gespeichert sind.

    • Ein Array von Arrays. Arrays werden wieder zu Zeigern abgebaut, daher handelt es sich hierbei um einen speziellen Fall des oben genannten. Dies wird häufig für sogenannte "gezackte" Arrays verwendet (im Gegensatz zu rechteckigen).

5
P Daddy

Sie können es wörtlich interpretieren - Zeiger auf einen Zeiger

4
BC.
  • int **var deklariert einen Zeiger auf einen Zeiger 
  • **var verweist auf den Inhalt eines Zeigers, der an sich auf einen Zeiger zeigt
3
Tony the Pony

Eine häufige Verwendung besteht darin, dass eine Funktion den Zeiger auf null setzen kann.
Free (Zeiger) gibt also den dem Zeiger zugewiesenen Speicher frei, lässt den Zeiger jedoch gefährlich in den freien Speicher.
Deklarieren Sie stattdessen einen my_free (** - Zeiger) und rufen Sie my_free (& pointer) auf, damit my_free () den Zeiger nach dem Freigeben auf Null setzen kann.

1
Martin Beckett
1
Joshua

Es ist eine der Verlockungen von C++ - Sigils. Aus eigener Erfahrung kann ich mit Dereferenzierungsoperatoren für Arrays & Vectors von STL eine schnellere und effizientere Lesezugriffsleistung verbürgen. Ich habe auch gewohnte Shared-Pointer-Methoden übernommen, wenn Sie neugierig sind. :)

0
cavalier_hacker