2010-11-22 13 views
1

Wie ich bisher gelernt habe, ist ein Zeiger ein Platz im Speicher (Heap), wo eine Speicheradresse gespeichert ist, ich verstehe das wirklich und kann damit so leicht umgehen, aber die Frage ist: wenn es nur eine Adresse speichert, dann ist es Größe ist symmetrisch mit der Größe des Speichers des Computers, und so alle Zeiger haben die gleiche Größe, dann warum Zeiger haben Typen, wenn ein Zeiger X ist definiert als Integer zum Beispiel, es hat die gleiche Größe wie der Poiter Y was ist definiert char, warum gibt es einen Compiler oder Laufzeitfehler, wenn ich eine Adresse von Doppel - oder einen beliebigen Typ diffrenet von Integer - zu X, und das gleiche für Y? Gibt es eine zusätzliche Komponente in der Struktur von Zeigern, die den Typ bestimmt?Was ist die wahre Struktur eines Zeigers?

Ich möchte nur die wirkliche Struktur von Zeigern wissen, wie genau sie funktionieren, und warum sie Typen haben.

Vielen Dank im Voraus :)

HINWEIS: Wenn ich eine Sprache geben haben, ist es C++

Antwort

3

Du hast Recht, ein Zeiger nur eine Speicheradresse enthält, und so alle Zeiger auf einem bestimmten Maschine haben genau die gleiche Größe.

Der Typ und die entsprechenden Compilerfehler sind hier, um Ihnen zu helfen, konsistenten Code zu machen. Aber sobald der Code kompiliert ist, kann nichts in der Speicherstruktur des Zeigers irgendetwas über seinen Typ sagen.

-1

Ich dachte, ein Zeiger wurde auf dem Stapel gespeichert und es zeigte auf einen Speicherort auf dem Heap?

Zeiger haben "Typen" genau wie Variablen, um die Typensicherheit zu gewährleisten und Ihnen zu ermöglichen, Probleme zur Kompilierzeit aufzuheben. Beachten Sie, dass dies nur zur Kompilierzeit geschieht (in C sowieso).

In der Realität können Sie per Code den Zeiger auf einen beliebigen Speicherort setzen und das ist es, was viele Probleme in Code und Sicherheitslücken verursacht, die Viren ausnutzen. Das Gehen entlang eines Arrays mit einem Zeiger ist ein üblicher Trick, aber dies ermöglicht es einem Zeiger, über das Ende des Arrays hinauszugehen und auf Teile des Speichers zuzugreifen, die Sie nicht erwartet haben.

+0

Ein Zeiger ist nur ein Wert, den der Compiler als Adresse interpretiert. Es kann auf dem Heap, auf dem Stapel oder nur vorübergehend in Registern gespeichert werden. Und Sie brauchen keine Zeiger, um die Möglichkeit zu haben, über das Ende eines Arrays hinauszugehen. Das können Sie genauso gut mit Indizes tun. –

+0

Na gut, lerne etwas Neues. –

0

Ein Zeiger zeigt beim Initialisieren auf das erste Byte der Daten, auf die er zeigt. Wenn beispielsweise ein Zeiger auf Daten zeigt, z. Der Zeiger kann dann auf den Wert 4 oder 5 zeigen (abhängig von der End-Inaktivität der Maschine). In ähnlicher Weise zeigt ein Doppelzeiger auf das erste Byte im Speicher der Daten, auf die er zeigt.

So haben alle Zeiger die gleiche Größe.

Je nach Art des Zeigers wird nun auf Daten aus dem Speicher zugegriffen. Auf einem 16-Bit-Computer, bei dem int 16 Bit ist, wird auf zwei Byte Daten (einschließlich des Startbytes aus dem Speicher, auf den der Zeiger zeigt, und des nächsten unmittelbaren Bytes) aus dem Speicher verwiesen, wenn dieser Zeiger dereferenziert wird. In ähnlicher Weise werden 4 Bytes referenziert, wenn ein langer Zeiger dereferenziert wird.

Dies ist, wie im Allgemeinen Pointer Dereferenzierung im Allgemeinen funktioniert. Kurz gesagt, Zeiger haben einen Typ, um die Daten korrekt zu dereferenzieren. Und alle Zeiger haben im wesentlichen die gleiche Grße, d.h. 1 Byte. Hoffe ich bin genug klar.

1

Ich kenne nicht die wirkliche Struktur von Zeigern (Ich mochte die Idee, also werde ich einen Blick auf das Thema werfen Ich denke, dass Sie etwas darüber in Automatentheorie und Programmiersprachen Design oder in Compiler Themen finden können) aber ich denke, Zeiger haben Datentypen, so dass der Computer weiß, wie viel Speicher der Zeiger zeigt, mit anderen Worten einen Zeiger, der auf ein Doppel zeigt, denke ich, dass der Zeiger auf die Adresse des ersten Wortes der Größe zeigt, die double takes, aber Sie möchten das Double auf dem Bildschirm ausgeben, wenn der Zeiger keinen Typ hatte, der mit dem Wert übereinstimmt, auf den er zeigt, wie würde der Computer wissen, wie viele Bytes er auf dem Bildschirm drucken soll!

Verwandte Themen