12 Stimmen

Was ist der Unterschied zwischen Zeigern und globalen Variablen in C?

Ich lese gerade Das C-Buch Ich glaube zwar, dass ich das Konzept von Zeigern im Allgemeinen verstehe, aber eine Sache fällt mir auf: Es scheint, als würde das, worauf der Zeiger zeigt, zu einer globalen Variablen verallgemeinert (z. B. die Möglichkeit, Zeiger zu verwenden, um Werte von void Funktionen), was natürlich alle damit verbundenen Gefahren mit sich bringt, nehme ich an.

Abgesehen von der Tatsache, dass ein Zeiger auf eine bestimmte Variable oder einen Index in einem Array verweist, was でございます den Unterschied zwischen einem Zeiger und einer globalen Variablen?

23voto

McPherrinM Punkte 4436

Es sind ganz unterschiedliche Tiere. Um das besser zu erklären, möchte ich beide definieren.

Zeiger:

Eine Variable enthält einen Teil der Daten. Ein Zeiger ist ein Datentyp, der auf einen anderen Speicherplatz verweist. Stellen Sie sich den Zeiger wie ein Schild vor, auf dem steht: "Da drüben ---->", das auf ein bestimmtes Objekt zeigt. Zum Beispiel sind Zeichenketten in C nur ein Zeiger auf ein Zeichen, und per Konvention weiß man, dass weitere Zeichen folgen, bis ein \0 Zeichen. C verwendet Zeiger ausgiebig, da es keinen anderen Mechanismus gibt, um gemeinsame Informationen zwischen Programmteilen auszutauschen, außer....

Globale Variablen:

In einem Programm haben Sie in jeder Funktion Variablen. Dabei kann es sich um die Parameter der Funktion und um Variablen handeln, die innerhalb der Funktion definiert sind. Darüber hinaus gibt es so genannte globale Variablen. In diesen Variablen werden Informationen gespeichert, auf die alle Funktionen in einer Datei zugreifen können. Dies kann nützlich sein, um Dinge wie einen globalen Status oder eine Konfiguration weiterzugeben. Zum Beispiel könnten Sie eine Variable namens debug die Ihr Code prüft, bevor er Nachrichten ausgibt, oder um ein globales Zustandsobjekt zu speichern, wie den Spielstand in einem Videospiel.

Ich glaube, das verwirrt Sie: Beide können verwendet werden, um Informationen zwischen Teilen des Codes auszutauschen. Da Funktionsargumente übergeben werden nach Wert in C kann eine Funktion die Variablen des Aufrufers nicht verändern. Es gibt zwei Möglichkeiten, dieses Problem zu "beheben". Die erste (und korrekte) Möglichkeit besteht darin, einen Zeiger auf die Variable an die Funktion zu übergeben. Auf diese Weise weiß die Funktion, wo sie die Variable des Elternteils ändern muss. Ein anderer Ansatz besteht darin, eine globale Variable zu verwenden. Auf diese Weise werden keine Zeiger weitergegeben, sondern die globalen Variablen werden direkt bearbeitet.

Man kann also beide verwenden, um dasselbe zu erreichen, aber wie sie funktionieren, ist völlig unterschiedlich. In der Tat kann eine globale Variable ein Zeiger sein.

7voto

San Jacinto Punkte 8628

Eine globale Variable ist eine Variable, die in jedem Bereich zugänglich ist. Ein Zeiger ist eine Variable, die die Adresse enthält, an der sich etwas befindet.

Sie sind in keiner Weise direkt miteinander verbunden.

Eine Zeigervariable kann sich im globalen oder lokalen Bereich befinden und kann auch auf eine Variable zeigen, die sich im globalen, lokalen oder keinem Bereich befindet (als ob sie aus dem Heap käme oder einige DIO-Leitungen adressiert).

7voto

Artelius Punkte 46771

Das ist ein großer Unterschied. Abgesehen von den "anderen" Verwendungszwecken von Zeigern (dazu gehören der Umgang mit Zeichenketten und Arrays sowie der Aufbau dynamischer Datenstrukturen wie Bäume und verknüpfte Listen) ist die Verwendung eines Zeigers, um einer anderen Funktion Zugriff auf eine lokale Variable zu gewähren, viel flexibler und kontrollierter als die gemeinsame Nutzung einer globalen Variable durch diese beiden Funktionen.

Erstens kann die aufgerufene Funktion Zugang erhalten zu verschiedene Variablen zu verschiedenen Zeitpunkten. Stellen Sie sich vor, wie viel mühsamer es wäre, die scanf() wenn es seine Ergebnisse immer in denselben globalen Variablen speichern würde.

Zweitens ist man sich bei der Übergabe eines Zeigers an eine andere Funktion viel stärker bewusst, dass diese Funktion das Objekt verändern kann. Wenn Sie eine globale Variable für denselben Zweck verwenden, vergessen Sie leicht, welche Funktionen die globale Variable verändern und welche nicht.

Drittens verbrauchen globale Variablen während der gesamten Laufzeit Ihres Programms Speicherplatz. Lokale Variablen werden freigegeben, wenn die sie enthaltende Funktion endet, und dynamisch zugewiesene Daten werden freigegeben, wenn sie free d. Globale Variablen können also mitunter eine beträchtliche Speicherverschwendung darstellen.

Bei der Verwendung von Zeigern besteht die Gefahr, dass auf Variablen verwiesen wird, die nicht mehr existieren, daher ist Vorsicht geboten. Dies ist jedoch meist ein Problem, wenn es komplizierte globale oder langlebige Datenstrukturen gibt, was an sich schon eine Designschwäche darstellt.

Globals stehen einem guten, modularen Programmdesign im Weg, und Zeiger bieten oft eine bessere Möglichkeit, dieselben Dinge zu erreichen.

3voto

Ken Punkte 1076

"Zeiger" ist eine Variable, die Ihnen sagt, wie Sie zu einem Wert gelangen: Es ist die Adresse des Wertes, der Sie interessiert. Sie dereferenzieren ihn (mit *), um an den Wert zu gelangen.

"Global" definiert den Geltungsbereich der Variablen: überall im Programm kann der Name angegeben und der Wert abgerufen werden.

Sie können lokale Zeiger oder globale Nicht-Zeiger haben. Die Konzepte sind völlig orthogonal.

2voto

Clifford Punkte 82130

Der Begriff Zeiger bezieht sich auf den Typ einer Variablen; es ist eine Variable, die verwendet wird, um auf eine andere zu verweisen. Der Begriff weltweit bezieht sich auf den Geltungsbereich einer Variablen, d.h. ihre Sichtbarkeit von jedem Teil eines Programms aus. Daher ist die Frage etwas unsinnig, da sie sich auf unterschiedliche Arten von Variablenattributen beziehen; eine Zeigervariable kann in der Tat einen globalen Geltungsbereich haben und somit beide Attribute gleichzeitig aufweisen.

Ein Zeiger kann zwar auf ein Objekt verweisen, das sich nicht direkt im Geltungsbereich befindet (worauf Sie sich meiner Meinung nach beziehen), aber er ermöglicht dennoch eine eingeschränkte Kontrolle des Geltungsbereichs, da der Zeiger selbst einen Geltungsbereich hat (es sei denn, es handelt sich um einen globalen Zeiger!).

Außerdem eine globale Variable siempre hat eine statische Speicherklasse. Ein Zeiger kann sich auf eine statische, dynamische oder automatische Variable beziehen, und da es sich um eine Variable handelt, kann der Zeiger selbst statisch, automatisch oder - im Falle eines dynamisch zugewiesenen Arrays von Zeigern - auch dynamisch sein.

Ich denke, dass Sie vielleicht nur eine sehr spezifische Verwendung von Zeigern in Betracht ziehen, während sie in Wirklichkeit einen viel größeren Nutzen haben und auf viele Arten verwendet werden können. Zum Beispiel würden Sie fast ausnahmslos Zeiger verwenden, um die Verknüpfungen in einer verknüpften Listendatenstruktur zu implementieren; eine globale Variable wird Ihnen dabei nicht helfen.

Clifford

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X