Syntax von Zeigern

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Syntax von Zeigern

Beitrag von Architekt » Sa Okt 18, 2014 12:51 pm

Ich hab mich das bisher eig. noch nie gefragt, aber: Wieso werden Zeigern eig. mit einem Sternchen gekennzeichnet und mit einem & referenziert? Also wie kam man auf die Idee, genau diese Syntax zu wählen?
Also zum klaren Verständnis, ich meine dies:
int* p = &a;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Syntax von Zeigern

Beitrag von Xin » So Okt 19, 2014 8:21 am

Architekt hat geschrieben:Ich hab mich das bisher eig. noch nie gefragt, aber: Wieso werden Zeigern eig. mit einem Sternchen gekennzeichnet und mit einem & referenziert? Also wie kam man auf die Idee, genau diese Syntax zu wählen?
Also zum klaren Verständnis, ich meine dies:
int* p = &a;
Ui, was Programmier-Sprachen-Philosophisches :-)

Wirklich richtige Antworten habe ich nicht. Aber ich habe Vermutungen.

Zum Zeiger: Ich glaube nicht, dass mit dem * ein Zeiger gekennzeichnet wird, sondern entsprechend ein "Mehrfaches", vergleichbar mit RegularExpressions bzw. in der Shell: "dir ster*" listet alles auf, wo hinter "ster" noch mehr folgt.
Ein int wird mit "char eins;" definiert und mit "char * viele" wird eine Variable deklariert, die auf viele Daten vom diesem Typ verweist. Die einfachste Möglichkeit das auf der Maschine zu realisieren ist der Zeiger.
So bringe ich in C Tutorien den Leuten Strings bei: char ist ein Buchstabe, char * sind viele Buchstaben. Und später bringe ich den Leuten Zeiger bei mit dem Kommentar, dass Zeiger nicht so kompliziert sind, wie alle immer sagen, weil wir sie schon die ganze Zeit nutzen.

Zum AddressOf-Operator: Eigentlich ist das @-Zeichen ja regelrecht prädestiniert für diese Operation. Wie es heute üblich ist, eine Hex-Zahl mit 0x einzuleiten, war es in den 80ern und frühen Neunzigern, wo ich C selbst noch gar nicht kannte, sondern mit diversen Basic-Dialekten unterwegs war, üblicher das @ Zeichen zu nutzen.
C kommt von 1972 und besitzt sogenannte Digraphen und Trigraphen, um für verschieden Computer Zeichen repräsentieren, die diesen Computern auf der Tastatur fehlen. Dazu gehören zum Beispiel die geschweiften Klammern, die ja
in C sehr wichtig sind, aber eben auf alten Computern überhaupt nicht existieren.
Computer aus den 70ern hatten nunmal keine Standard-PC-Tastatur, der ja erst in den frühen 80ern kam. Da war C schon 10 Jahre alt.

Kurz: Man musste sich halt mit den Zeichen behelfen, die nunmal da waren. Also vermute ich, dass ansonsten keine Zeichen mehr da waren. Ich wunderte mich früher nämlich auch immer, warum zum Beispiel @ und $ in C überhaupt keine Rolle spielen, bis ich an einem Computer saß, der keine geschweiften Klammern hatte...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: Syntax von Zeigern

Beitrag von Architekt » So Okt 19, 2014 4:25 pm

Als RegEx Fan kam mir auch schon der Gedanke, aber wieso steht * eig. für 0 bis unendlich? Wer hat es entschieden? ;)
edit: Ah Kleenesche Hülle. Alles klar! :D

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Syntax von Zeigern

Beitrag von oenone » Mo Okt 20, 2014 9:18 am

Historisch gesehen kommt das '*' von der Programmiersprache B (Nachfolger von BCPL, Vorgänger von C). In BCPL war es noch ein '!'. Auch das '&' kommt von B:
To facilitate manipulation of addresses when it seems advisable, B provides two unary ad~ress operators, '*' and '&'. '&' is the address operator so &x is the address of x, assuming it has one. '*' is the indirection operator; "*x" means "use the content of x as an address."
Warum wurde jetzt aus dem '!' ein '*'? Vielleicht, weil das '!' in B für Negation stehen sollte. BCPL hat oft Wörter benutzt (so auch 'logand' statt '&&', etc..). B sollte die ganze Syntax etwas verkürzen.

Und warum ein '&' für den Adress-Operator? Vielleicht, weil '*' shift+6 war und '&' shift+7, aber genau weiß es wohl nur Ken Thompson.

Benutzeravatar
Architekt
Beiträge: 172
Registriert: Sa Mai 24, 2014 12:04 pm

Re: Syntax von Zeigern

Beitrag von Architekt » Mo Okt 20, 2014 9:49 am

Sehr cool, danke. Woher stammt die Info?

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Syntax von Zeigern

Beitrag von oenone » Mo Okt 20, 2014 10:13 am

Das Quote hiervon, Abschnitt 22: http://cm.bell-labs.com/cm/cs/who/dmr/btut.html

Das andere sind Spekulationen. Teilweise übernommen von http://programmers.stackexchange.com/qu ... r-pointers (dort ist es auch noch etwas ausführlicher).

Antworten