it-swarm.com.de

Was ist der Unterschied zwischen einem Zeiger und einer Zeigervariablen?

Ich weiß, dass dies sehr einfach ist, aber es ist ein bisschen verwirrend für mich.
Ich habe gelesen:

ein Zeiger ist nichts anderes als eine Adresse , und eine Zeigervariable ist nur eine Variable, die eine Adresse speichern kann.
Wenn wir die Adresse einer Variablen i in der Zeigervariable p speichern, sagen wir, dass p auf i verweist.

int i, *p = &i;

p zeigt auf i.

Um auf das Objekt zuzugreifen, auf das ein Zeiger zeigt, verwenden wir den Operator * (Indirektion).

Wenn p ein Zeiger ist dann repräsentiert *p das Objekt, auf das p aktuell zeigt.

Jetzt bin ich verwirrt, was soll ich als p - pointer oder pointer variable bezeichnen?

Zusätzlich: Entspricht ein Zeiger immer einer Adresse?

9
haccks

Der Unterschied zwischen einem Zeigerwert und einer Zeigervariablen wird durch Folgendes veranschaulicht:

int swap_int(int *i1, int *i2)
{
    int t = *i1;
    *i1 = *i2;
    *i2 = t;
}

int main(void)
{
    int  v1 = 0;
    int  v2 = 37;
    int *p2 = &v2;
    printf("v1 = %d, v2 = %d\n", v1, v2);
    swap_int(&v1, p2);
    printf("v1 = %d, v2 = %d\n", v1, v2);
    return 0;
}

Hier ist p2 Eine Zeigervariable; Es ist ein Zeiger auf int. Andererseits ist im Aufruf von swap_int() das Argument &v1 Ein Zeigerwert, aber in keiner Weise eine Zeigervariable (in der aufrufenden Funktion). Es ist ein Zeiger auf eine Variable (und diese Variable ist v1), Aber durch einfaches Schreiben von &v1 Wird keine Zeigervariable erstellt. Innerhalb der aufgerufenen Funktion wird der Wert des Zeigers &v1 Der lokalen Zeigervariablen i1 Und der Wert der Zeigervariablen p2 Der lokalen Zeigervariablen zugewiesen i2, Aber das ist nicht dasselbe wie &v1 Ist eine Zeigervariable (weil es keine Zeigervariable ist; es ist einfach ein Zeigerwert).

Für viele Zwecke ist die Unterscheidung jedoch unscharf. Die Leute würden sagen 'p2 Ist ein Zeiger' und das ist wahr genug; es ist eine Zeigervariable und sein Wert ist ein Zeigerwert und *p2 ist der Wert des Objekts, auf das p2 zeigt. Sie erhalten die gleiche Unschärfe mit "v1 Ist ein int"; es ist tatsächlich eine int Variable und ihr Wert ist ein int Wert.

6

Ersetzen Sie den Word- "Zeiger" durch einen hoffentlich bekannteren Datentyp wie eine int:

int n = 42;

Hier ist 42 ein int-Wert, und n ist eine Variable, die eine int enthält. Sie könnten n eine "int Variable" nennen. Ein int ist eine Zahl wie 42 oder -25315685, und eine Variable int enthält diese Zahlen. Sobald Sie eine Variable haben, können Sie ihr unterschiedliche Nummern zuweisen. Nichts verwirrend bisher?

Ein Zeiger ist wie ein int: eine Zahl. Es ist eine Nummer, die einen Speicherort identifiziert, und wenn etwas an diesem Speicherplatz gespeichert ist, können Sie es als address bezeichnen. Wie ein int kann ein Zeiger in einer Variablen gespeichert werden. Eine Variable, die einen Zeiger speichert, kann als Zeigervariable bezeichnet werden.

Also, was ist der Unterschied zwischen einem Zeiger und einer Zeigervariable? Der erste Wert ist wie eine Zahl ein Wert, der zweite speichert diese Werte. Oft beziehen sich die Menschen jedoch auf Variablen anhand ihrer Werte, die sie speichern. Leute nennen nicht n eine "int Variable", sondern nur int, obwohl sie zu unterschiedlichen Zeiten verschiedene ints speichern kann. In diesem Text mache ich dasselbe und schreibe manchmal Zeiger, wenn ich eine Zeigervariable meine. hoffentlich wird der unterschied klar sein.

Ist ein Zeiger immer eine Adresse? Dies ist mehr als alles andere eine Frage zur Bedeutung des Wortes "Adresse". Ein Zeiger ist immer eine Adresse in dem Sinne, dass er auf die eine oder andere Weise einem Speicherplatz entspricht, es ist eine "Adresse" für diesen Speicherplatz. Wenn der Speicherplatz jedoch für das Programm nicht zugänglich ist oder nichts Nützliches darin gespeichert ist, ist es andererseits eine "Adresse" für irgendetwas?

Untersuchen wir nun den folgenden Code:

int *p;
p = &n;

Die erste Zeile deklariert eine Zeigervariable namens p. Die Zeiger, die in p gespeichert werden können, sind Speicherorte für int-Daten. Dies ist aus Gründen wichtig, die wir später sehen werden. Wir geben p immer noch keinen Wert, daher ist der Zeiger beliebig. Es speichert sicherlich nicht die Adresse von etwas Nützlichem; es kann sogar auf einen Speicherbereich verweisen, auf den das Programm keinen Zugriff hat.

In der zweiten Zeile nehmen wir die Adresse der Variable n mit dem Operator &- und weisen sie p zu. Nun speichert p die Adresse von n, dem Speicherort, an dem der Wert von n gespeichert ist.

Was können wir mit einem Zeiger machen? Wir können in den Speicherplatz lesen und schreiben, den der Zeiger angibt. Dazu "deneferen" wir den Zeiger mit dem *- Operator, und dann kann (*p) genauso wie n verwendet werden. So können Sie beispielsweise einen neuen Wert in n schreiben:

*p = 123;

An diesem Punkt wird es offensichtlich, warum wir wissen müssen, auf welchen Datentyp p verweisen kann: Andernfalls können Sie nicht wissen, was Sie (*p) zuweisen könnten.

Ein weiterer Grund, warum es wichtig ist, den Datentyp zu kennen, auf den p zeigen kann, ist Zeigerarithmetik . Zum Beispiel ist p+1 ein Zeiger auf die int, die direkt nach n im Speicher gespeichert ist. Wenn p ein Zeiger auf eine große Datenstruktur wäre, wäre p+1 ein Zeiger auf eine gleich davor gespeicherte Datenstruktur desselben Typs. Dazu muss der Compiler wissen, auf welche Größe der Zeiger zeigt.

5
Joni

Das Token p ist eine Zeigervariable, die auf eine Variable i zeigt. Wir können es einfach einen Zeiger nennen. 

Eine erklärung: 

int* p;
int i;
p = &i; 

deklariert p als Bezeichner eines int-Objekts. Dies wird normalerweise genauer als 'p is a pointer to i' angegeben. p kann verwendet werden, um auf die Int-Variable i nach dem Ausdruck p = &i zu verweisen. Um auf den Wert der Variablen i mit dem Zeiger p zuzugreifen, können Sie den Dereferenzierungsoperator * (z. B. *p) verwenden. Und i = 10; entspricht *p = 10;

Beachten Sie auch den Ausdruck p = &i;, um die Adresse von i zu lesen. Ich habe & kaufmännisches Und-Zeichen verwendet, auch Address of operand genannt.

Ein Zeiger ist nur eine logische Adresse (ein Bezeichner, mit dem auf eine Variable verwiesen werden kann). Der C-Standard definiert nicht, was ein Zeiger intern ist und wie er intern arbeitet. 

Sie möchten lesen: Was genau ist ein C-Zeiger, wenn nicht eine Speicheradresse?
Lesen Sie außerdem Folgendes: um den Zweck von Zeigern zu verstehen.

2
Grijesh Chauhan

Die Begriffe Zeiger und Zeigervariable werden häufig synonym verwendet.

0
junix

Eine Variable ist ein Ort zum Speichern eines Werts. Wenn Sie in C eine Variable in einem Kontext verwenden, für den ein Wert erforderlich ist, wird der Wert der Variablen abgerufen. In diesem Kontext bedeutet "p" dasselbe wie "der Wert der Variablen p":

int *q = p;  // Copy the value of variable p into the variable q.
             // aka: copy p into q.
0
Vaughn Cato