variablen und pointer



  • die frage ist warscheinlich ziemlich bescheuert , aber irgendwie hab ich immer noch nicht den unterschied zwischen variable und pointer verstanden.
    also ich weiß, dass ein pointer eben nur auf einen bereich im speicher zeigt und eine variable so zusagen direkt der speicher ist (oder 😕 ).
    aber wofür genau kann ich dann pointer besser benutzen und wofür variablen, weil im endeffekt ist es dann doch das gleiche ?
    ich hab auch schon gesucht aber nichts passendes gefunden.

    danke schonmal im voraus 👍



  • Eine Variable ist im Grunde nur ein Label für einen Speicherbereich, so das du diesen bequemer ansprechen kannst. Wenn du z.B. in einem lokalen Bereich eine Integervariable i hast (int i = 4), dann gibt es jetzt auf dem Stack einen Speicherbereich, den du mit i ansprechen kannst. IN diesem Speicherbereicht steht 4 drinnen. Ein Pointervariable ist auch eine Variable, nur dass dieser Variablentyp Adressen aufnimmt.

    Zeiger benutzt du z.B. um Daten effizient zu übergeben oder zum Verwalten von dynamischen Datenstrukturen.



  • danke für die schnelle antwort,
    aber eigentlich könnte ich in einem programm doch auch alles ohne pointervariablen machen. oder gibt es irgendeine sache die nur mit "normalen" variablen nicht klappt, also wo man pointervariablen braucht? oder wo pointervariablen schneller/effizienter sind? 😕



  • new?



  • Pointer ermoeglichen dir mehr dynamik. Ausserdem lassen sich damit lustige Fehler produzieren.



  • yodas schrieb:

    danke für die schnelle antwort,
    aber eigentlich könnte ich in einem programm doch auch alles ohne pointervariablen machen. oder gibt es irgendeine sache die nur mit "normalen" variablen nicht klappt, also wo man pointervariablen braucht? oder wo pointervariablen schneller/effizienter sind? 😕

    Wenn ich ein megafettes Konstrukt habe, in dem 18 Megabyte Daten drinstecken, dann wird dieser ganze Scheiß kopiert wenn ich den als Parameter einer Funktion übergebe. D.h. es ist lahm wie Sau und es kostet weitere 18 MB Speicher.
    Wenn ich aber nur einen Zeiger übergebe, der auf dieses Konstrukt zeig, kostet mich das gerademal 32 Bit auf einer 32-Bit-Maschine (4 Byte).



  • [0x[90]| schrieb:

    Ausserdem lassen sich damit lustige Fehler produzieren.

    ROFL

    ...und vor allem schwer zu findene!! 😃

    Das ist das beste daran! 😋 👍



  • Sgt. Nukem schrieb:

    Wenn ich ein megafettes Konstrukt habe, in dem 18 Megabyte Daten drinstecken, dann wird dieser ganze Scheiß kopiert wenn ich den als Parameter einer Funktion übergebe. D.h. es ist lahm wie Sau und es kostet weitere 18 MB Speicher.

    Mal ganz abgesehen davon, dass dir dann dein Programm abkackt, weil du zB nur 1 MB an Stack zur Verfügung hat.



  • groovemaster schrieb:

    Sgt. Nukem schrieb:

    Wenn ich ein megafettes Konstrukt habe, in dem 18 Megabyte Daten drinstecken, dann wird dieser ganze Scheiß kopiert wenn ich den als Parameter einer Funktion übergebe. D.h. es ist lahm wie Sau und es kostet weitere 18 MB Speicher.

    Mal ganz abgesehen davon, dass dir dann dein Programm abkackt, weil du zB nur 1 MB an Stack zur Verfügung hat.

    War auch nur ein Beispiel. 💡



  • groovemaster schrieb:

    Mal ganz abgesehen davon, dass dir dann dein Programm abkackt, weil du zB nur 1 MB an Stack zur Verfügung hat.

    Stimmt so nicht. Vllt. unter Windows, Linux allokiert den Stack jedoch dynamisch und so weit ich weiss ist die obere Grenze dort weitaus ueber 1 mb. Fuer die ganz Mutigen gibt es daher auch noch alloca (3) unter Linux/BSD. Ausserdem ist das ganze auch ziemlich Compiler abhaengig.
    Ich denke aber, dass der Stack groesser als 1 mb sein muss. Stell dir doch mal vor, eine Anwendung mit polymorphem ASCII darstellbarem Code wuerde (je nach Groesse/Funktion) niemals in 1 mb passen (wobei man den rest des Ganzen auch noch bedenken muss).
    //edit: Ach btw, vllt. meine Sgt. Nukem Kernel Space Zeug mit 16mb stack 😉 Dort ist sowas definitv moeglich.



  • [0x[90]| schrieb:

    Stimmt so nicht. Vllt. unter Windows, Linux allokiert den Stack jedoch dynamisch und so weit ich weiss ist die obere Grenze dort weitaus ueber 1 mb.

    Du kannst unter Windows auch mehr als 1 MB an Stack zur Verfügung stellen. 1 MB ist jedoch afaik der Default Wert.
    Und dass der Stack unter Linux dynamisch ist, glaub ich dir irgendwie nicht. alloca (bzw _alloca) gibts auch unter Windows, und da kannst du auch nur maximal den Speicher reservieren, den das Programm beim Start zugewiesen bekommen hat.

    [0x[90]| schrieb:

    Stell dir doch mal vor, eine Anwendung mit polymorphem ASCII darstellbarem Code wuerde (je nach Groesse/Funktion) niemals in 1 mb passen (wobei man den rest des Ganzen auch noch bedenken muss).

    Hä, seit wann wird denn ein Programm in den Stack geladen. Ich kann nicht für Linux sprechen, unter Windows jedenfalls nicht.



  • Habs gerade mal ausprobiert. Bei 1MB ist Schluss auf dem Stack (Visual Studio 6).



  • Hatte ich doch noch richtig in Erinnerung. 🤡
    Afaik lässt sich diese Grösse mit dem Linkerflag '/STACK' beeinflussen. Muss ich bei Gelegenheit auch mal ausprobieren.



  • groovemaster, ich bin ziemlich sicher dass der Linux stack dynamisch ist. Google einmal ein wenig falls du naeheres wissen willst.
    Du kannst keine Programme im Stack ausfuehren, du kannst aber ausfuehrbaren shellcode mittels sub/and auf den Stack schieben. D.h. dass es moeglich ist Teile deines Codes im Stack auzufuehren, sofern der Hardwarecheck der jeweiligen Architektur nicht dazwischenpfuscht und das ganze vereitelt.



  • Ich bezweifle zwar ebenfalls, dass der Stack unter Linux dynamisch ist, aber darum geht es ja nicht. Esht um Dinge, die man mit Zeigern machen kann, mit "normalen" Variabeln hingegen aber nicht. Und was fällt einem da sofot ein? Richtig, rekursive Datenstrukturen, also Listen, Bäume, ...



  • danke für die vielen antworten,
    ich glaub ich hab es jetzt verstanden 😃



  • Cpp_Junky schrieb:

    Habs gerade mal ausprobiert. Bei 1MB ist Schluss auf dem Stack (Visual Studio 6).

    Wie hast du das getestet?

    Ich hab ne Klasse erstellt

    class test { int a[2*256]; };

    was den Objekten ne Größe von 2 MB verleiht! Hab sie dann als Wert an ne Funktion übergeben. Hat alles funktioniert. 😕 Nix abgestürzt.



  • Henrie Maske schrieb:

    Cpp_Junky schrieb:

    Habs gerade mal ausprobiert. Bei 1MB ist Schluss auf dem Stack (Visual Studio 6).

    Wie hast du das getestet?

    Ich hab ne Klasse erstellt

    class test { int a[2*256]; };

    was den Objekten ne Größe von 2 MB verleiht!

    Das sind 2KB und nicht 2MB 🙄


Anmelden zum Antworten