Forum: Mikrocontroller und Digitale Elektronik Wann und wozu Pointer?


von Peter (Gast)


Lesenswert?

Hallo,
ich habe mal eine Grundfrage. Wann und wozu werden Pointer verwendet und 
wann nicht? Wozu muss ich wissen auf welcher Adresse eine Variable 
liegt? Warum kompliziert über zwei Pointer eine Variable ändern wenn ich 
es auch direkt machen kann?
Danke für Eure Hinweise im Vorfeld.
Grüße
Peter

von Stefan K. (stefan64)


Lesenswert?

z.B.:
Wenn eine Funktion eine Variable ändern können soll, muss sie die 
Adresse wissen, wo sie ändern soll.

und auch:
Es ist wesentlich effektiver, an eine Funktion Pointer auf Strings oder 
structs zu übergeben, als die Daten selber.

von Cyblord -. (cyblord)


Lesenswert?

Peter schrieb:
> Hallo,
> ich habe mal eine Grundfrage. Wann und wozu werden Pointer verwendet und
> wann nicht?
C-Buch. Ehrlich!

> Wozu muss ich wissen auf welcher Adresse eine Variable
> liegt?
Die konkrete Adresse (als Zahl) interessiert in der Tat fast niemanden. 
Ergo ist deine Annahme schon mal falsch, du musst es nicht wissen. Aber 
du willst vielleicht einen Pointer auf eine Variable zeigen lassen.

> Warum kompliziert über zwei Pointer eine Variable ändern wenn ich
> es auch direkt machen kann?
Direkt geht halt nicht immer.
Der häufigste Fall: Du hast eine Struktur (struct) und eine Funktion 
soll nun Daten generieren und diese in die Struktur eintragen. Dann 
übergibst du einen Pointer auf diese Struktur an die Funktion. Die 
Funktion trägt die Daten ein. Wie willst du das "direkt" lösen?

von TM F. (p_richner)


Lesenswert?

Damit du z.B. in einer Funktion ein ganzes Array beschreiben kannst und 
du nur ein Wert übergeben musst(Adresse des ersten Speicherplatzes).
Oder um in einer Unterfunktion die Variable, die im main definiert ist, 
zu verändern.

Pointer sind hilfreich, um globale Variablen zu vermeiden.

von U. C. (Gast)


Lesenswert?

Am liebsten würde ich sagen:
Wenn du keinen Bedarf an Pointern hast, dann brauchst du sie auch nicht.


Aber:
Pointer/Zeiger/Adressen werden dauernd verwendet....
z.B. Beim durchlaufen von Arrays und Strings
Wenn auch nicht unbedingt explizit, aber im Hintergrund dann doch.

von M. K. (sylaina)


Lesenswert?

Wie schon gesagt wurde: Sobald man Array und Strings verwendet nutzt man 
schon Pointer, auch wenn man es als Laie nicht direkt sieht. Pointer 
können das Leben unglaublich vereinfachen…aber auch unglaublich 
erschweren. Aber im Prinzip sind auch Pointer kein Hexenwerk, man 
braucht wie bei so vielem einfach nur etwas Übung damit.

von Lars K. (mrlaush)


Lesenswert?

Ich kann mich da nur anschließen.

Grade wenn du Objektorientiert programmierst wird es echt mühselig alles 
bei Call by value zu realisieren.
Du müstest ja dann immer jedes Objekt erzeugen wenn du es an eine 
Funktion übergibst.
Oder wenn du Schnittstellen öffnest schließt verwendest... da wüsste ich 
jertzt auf anhieb gar nicht wie das ohne pointer gehen sollte.

von Der Andere (Gast)


Lesenswert?

Wozu hast du eine Adresse? Damit dir jemand was schicken kann und weiss 
wohin er das schicken soll.

Wozu braucht man in einer Programmiersprache eine Adresse? Damit jemand 
(eine Funktion/Prozedur) weiss wo sie für dich ein Ergebnis hinschreiben 
soll.

von Peter (Gast)


Lesenswert?

Danke für eure Hilfe. Das heißt also im Prinzip, bevor ich ein Objekt in 
eine Funktion übergebe ist es einfacher die Adresse von dem Objekt zu 
übergeben und dann direkt die Variable auf dieser Adresse zu ändern?

von Cyblord -. (cyblord)


Lesenswert?

Peter schrieb:
> Danke für eure Hilfe. Das heißt also im Prinzip, bevor ich ein Objekt in
> eine Funktion übergebe ist es einfacher die Adresse von dem Objekt zu
> übergeben und dann direkt die Variable auf dieser Adresse zu ändern?

Was heißt einfacher? Wie sonst soll die Funktion Daten im Objekt ändern, 
wenn du eine Kopie (by value) an die Funktion übergibst?
Soll die Funktion die Daten nur lesen, ist es in der Tat fast egal. Aber 
auch hier übergibt man meist einen Pointer.

: Bearbeitet durch User
von Noch einer (Gast)


Lesenswert?

> ... bevor ich ein Objekt übergebe ...

Manchmal willst du ein Objekt übergeben, manchmal eine Kopie des 
Objektes.

Vielleicht liegt der Knoten hier: In C kannst du kein Objekt übergeben. 
In C kannst du nur Pointer oder Kopien übergeben.

War vielleicht ein Fehler in der C-Denkweise. Hat sich aber so 
eingebürgert und wird sich nicht mehr ändern. Wenn du einfach nur 
Objekte übergeben willst, brauchst du Pointer.

von Daniel A. (daniel-a)


Lesenswert?

Noch einer schrieb:
> Vielleicht liegt der Knoten hier: In C kannst du kein Objekt übergeben.
> In C kannst du nur Pointer oder Kopien übergeben.
>
> War vielleicht ein Fehler in der C-Denkweise

Ich sehe das genau umgekehrt:

Was ein Objekt ausmacht sind seine Daten. Ob man nun die Zahl 10 an zwei 
unterschiedlichen Orten hat ist egal, es bleibt eine 10. In C kann man 
Objekte mit all ihren Eigenschaften übergeben, man erhält dann effektiv 
eine Kopie. Wenn man aber ein bestehendes Objekt referenzieren will, 
muss man das explizit angeben und sieht das an einem schönen Pointer.

Andere Programmiersprachen machen das nicht so gut, egal ob Java, 
JavaScript, PHP, Python, etc. Dort wird das verschleiert. Wenn man dann 
behauptet, ein "Objekt" zu übergeben, wird dort nur eine Objektreferenz 
und nicht wirklich das Objekt (aka dessen Daten) übergeben.

von Lars B. (larsb)


Lesenswert?

Ich vermute dass der Fragesteller sich auf Pointer bei mikrocontrollern 
bezieht, nicht auf den Sinn von pointern generell, das kann man nämlich 
leicht nachlesen.
Bei controllern mit wenig Speicher, kann manuelle Speicherverwaltung 
sinnvoll sein und den Speicher wirklich komplett auszunutzen. Dabei 
braucht man dann poiter.
Hier geht es ja auch noch öfter mal um 8 bit controller und da ist 
Objektorientierte programmierung eher die Ausnahme.

von Sascha (Gast)


Lesenswert?

Und noch ein Grund: Ein Pointer ist nur so breit wie für die RAM 
Adressierung notwendig, für 32kB RAM also zum Beispiel 32 Bit.

Wenn hinter dieser Speicherstelle ein längerer String steht (diverse 
kB), ist es auf jeden Fall deutlich performanter zu sagen "Da an Adresse 
x findest du den String" als den kompletten String einmal quer durch den 
RAM zu schieben.

Das gilt natürlich auch für beliebige andere Datentypen die etwas mehr 
Speicherplatz als ein Integer belegen.

von The D. (thedaz)


Lesenswert?

Sascha schrieb:
> Und noch ein Grund: Ein Pointer ist nur so breit wie für die RAM
> Adressierung notwendig, für 32kB RAM also zum Beispiel 32 Bit.
>

prust

Zeit für Feierabend?

von Fpgakuechle K. (Gast)


Lesenswert?

Peter schrieb:
> Hallo,
> ich habe mal eine Grundfrage. Wann und wozu werden Pointer verwendet und
> wann nicht? Wozu muss ich wissen auf welcher Adresse eine Variable
> liegt? Warum kompliziert über zwei Pointer eine Variable ändern wenn ich
> es auch direkt machen kann?

Indirekte Addressierung:
https://de.wikipedia.org/wiki/Adressierung_%28Rechnerarchitektur%29
https://en.wikipedia.org/wiki/Addressing_mode#Simple_addressing_modes_for_data

mit postinkrement vom Maschinencode direkt unterstütz und dadurch 
besonders schnell und ideal für Skalarprodukte (braucht man bei der DSP)


C-Buch ist da eine schlecuhter Ratgeber aber jedes Assemblerbuch sollte 
erhellen

MfG,

von Bernd K. (prof7bit)


Lesenswert?

Lars B. schrieb:
> Hier geht es ja auch noch öfter mal um 8 bit controller und da ist
> Objektorientierte programmierung eher die Ausnahme.

Das liegt nicht an den 8 bit sondern an der Art und Weise wie diese 
Leute programmieren gelernt (oder nicht gelernt) haben. Wenn es sich 
anbietet Daten als Objekte und Funktionen als Methoden derselben zu 
behandeln weil man dann mit übersichtlicherem und meist auch mit weniger 
Code auskommt dann tut man das einfach, ganz egal wie viel oder wenig 
Bits die CPU hat.

: Bearbeitet durch User
von zeiger (Gast)


Lesenswert?

Pointer nimmt man zur Dereferenzierung, z.B.:
1
int meinarray[10];
ist ein Pointer auf den Speicherbereich den "meinarray" bezeichnet 
sprich anfängt.
Jede Funktion/Prozedur ist ebenfalls ein Pointer der auf den 
Speicherbereich zeigt wo die Funktion/Prozedir anfängt.
Das kann man in Assembler gut erkennen, da dort mittels jmp 
hingesprungen wird.
Explizit Pointer zu nehmen kommt für Datenstrukturen in Frage oder man 
kann einen void Pointer nehmen und damit alles mögliche veranstalten, 
wenn man denn weiß was man tut.
Je nach Zielsystem ist der Pointer xbit lang und kann daher auch nur 
2^xbit adressieren.
Der PC in der CPU ist nichts anderes als der Pointer der auf den 
Speicherbereich zeigt der als nächstes gelesen und ausgeführt wird.
Wenn Du konkretere Fragen hast dann frage nachdem Du ein passendes Buch 
für die Programmiersprache XYZ durchgelesen hast und da was unklar ist.

von Michael B. (laberkopp)


Lesenswert?

Peter schrieb:
> ich habe mal eine Grundfrage. Wann und wozu werden Pointer verwendet und
> wann nicht?

Wenn ein und dieselbe Programmstelle mal eine Variable und zu einem 
anderen Durchlauf eine andere Variable (zum lesen und ggf. verändern) 
benutzen soll.
Sind die Variablen Elemente eines Array, geht auch indizierter 
Arrayzugriff a[i], sind es aber Variablen aus unterschiedlichen Quellen 
r, s geht nur der Pointer a=&r, a=&s

von Michael P. (mpl)


Lesenswert?

Ich habe gelernt: willste was am Klavier ändern/reparieren bring nicht 
das schwere Klavier zum klaviermacher sonder lass den Klaviermacher zum 
schweren klavier kommen.

von Fpgakuechle K. (Gast)


Lesenswert?

Peter schrieb:
> Hallo,
> ich habe mal eine Grundfrage. Wann und wozu werden Pointer verwendet und
> wann nicht? Wozu muss ich wissen auf welcher Adresse eine Variable
> liegt? Warum kompliziert über zwei Pointer eine Variable ändern wenn ich
> es auch direkt machen kann?

Beispiel: Bildwiederholspeicher -

Lösche (Bildschirmspeicher mit = füllen) ohne pointer

mov  addr_video+0 <- 0x00
mov  addr_video+1 <- 0x00
mov  addr_video+2 <- 0x00
...
mov  addr_video+nuofpixel <- 0x00

mit pointer
loop:
mov  reg         <- nuofpixel
mov  index_reg   <- addr_video
mov  (index_reg) <- 0x00
inc  index_reg
dec  reg
jmpnz loop

6 zeilen code

MfG,

von (prx) A. K. (prx)


Lesenswert?

Fpga K. schrieb:
> mit postinkrement vom Maschinencode direkt unterstütz und dadurch
> besonders schnell und ideal für Skalarprodukte (braucht man bei der DSP)

C wiederspiegelt solche Maschinenstrukturen. In den 70ern spielte das 
eine Rolle, wenn der Compiler auf damaligen Rechnern unterhalb der 
Mainframes laufen sollte.

Aber die Zeit, in der explizite Pointer-Wanderungen eine grössere Rolle 
bei der Effizienz des erzeugten Codes spielten, die ist längst vorbei. 
Heutige Compiler implementieren auch Schleifen mit Index über 
inkrementierte Adressregister, wenn sinnvoll.

: Bearbeitet durch User
von Echte Computer sind PCs überlegen (Gast)


Lesenswert?

Emfehlenswerter Lehrbuchklassiker: "Algorithmen und Datenstrukturen"


Und hier: kleine Flohzirkuswelt.
Nur über Referenzen auf Daten wird gesprochen, die dicke Post der 
Informatik geht aber erst richtig los mit Funktionspointer.

Elementarbeispel Sortierung: vergleiche und ggfs. tausche.
Blöd halt dass structs nicht einfach per ==/</> zu vergleichen sind.
Also muss eine generische Implementation eines Sortieralgorithmus 
nicht die von der Programmiersprache mitgebrachten Operatoren vewenden, 
sonder der Anwender des Algorithmus gibt da ein Pointer auf eine für die 
jeweiligen (komplexen, nicht nativen) Datentypen passende 
Vergleichsfunktion mit.

Anderes Beispiel: zur Laufzeit flexibel konfigurierbare zeitgesteuerte 
Abläufe.
Wenn die Zeit gekommen ist, führe aus was dann "auf der Liste steht".
Also müssen zu gegebener Zeit Funkionen aufgerufen werden, welche weder 
beim Compilieren noch beim starten des uCs ausgewählt sind: der Anwender 
kann ja erst bei gestartetem System "die Liste für Übermorgen 13:45 
zusammenstellen"...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.