C++ Tutorial [032] - Pointer GERMAN

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 ธ.ค. 2024

ความคิดเห็น • 50

  • @MKMD115
    @MKMD115 9 ปีที่แล้ว +18

    Habe schon gespannt auf die Episode über Pointer gewartet.
    Ich fand es super erklärt und bin auf deine Anwendungsbeispiele gespannt, weil ich mich bis heute nicht so wirklich mit den Pointern anfreunden kann.

  • @NimmiCraft
    @NimmiCraft 9 ปีที่แล้ว +1

    Wollte mich nur mal für die tollen Videos bedanken. Mach weiter so.

  • @zZSkarbogZz
    @zZSkarbogZz 9 ปีที่แล้ว +6

    hiho, auch wenn ich (von der Performance abgesehen, noch keinen Anwendungsfall habe stellt sich mir folgende Frage.
    Wie sieht es aus wenn die Zahl größer als die 8bit ist? Immerhin würde sie dann ja eine weitere Speicherzelle benötigen, der Pointer aber zeigt auf die ....fda8 (in deinem Beispiel).

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว +4

      zZSkarbogZz Gute Frage! Die Antwort ist, dass du mit int* angibtst einen Pointer auf int zu machen! Genauso geht auch float*, dann machst du einen Pointer auf float. Daher weiß der Compiler, dass du beim bearbeiten des inhaltes des int* auch die nächsten 3 bytes (oder wie groß int auch immer ist) mitbearbeiten möchtest.MfG

    • @zZSkarbogZz
      @zZSkarbogZz 9 ปีที่แล้ว +3

      ***** Alles klar, also muss man sich dann darum nicht kümmern.Besten Dank für die flotte Anwort :)Btw. bisher eine sehr gut strukturierte und vorgetragene Reihe!

    • @LawnMeower
      @LawnMeower 6 ปีที่แล้ว

      Es gibt Pointer für alle primitiven Datentypen. Ein Pointer, egal für welchen Datentyp belegt bei 32bit-Anwendungen 4 Byte, bei 64bit-Anwendungen 8 Bytes. Ein Pointer des Typs char* liest/schreibt allerdings einen char-Wert. Ein Pointer eines long long* einen long long-Wert (der also hier im Beispiel die Speicherzellen von ...fda8 bis ...fdaf betrifft). Man kann durch Casting aber auch z.B. nur ein Byte eines ints laden. Das ist z.B. nützlich, will man Werte in umgekehrte Byte-Reihenfolge laden oder schreiben (char val = *(char*)64bit_ptr; lädt das kleinste Byte eines long long)

  • @MadpolygonDEV
    @MadpolygonDEV 3 ปีที่แล้ว

    Nicht sicher ob du das hier liest aber 1:20 bei int Zahl und in dem Speicher wird 100 0 0 0 eingetragen. Ich dachte es wäre in hex gespeichert? Wie würde es aussehen wenn man zb den Max wert für zahl eingegeben hätte (2 Mrd). Wie würde der 4 byte block dann aussehen? Bin nur bisschen verwundert wieso 100 0 0 0

  • @jojo-nh3yj
    @jojo-nh3yj 2 ปีที่แล้ว +1

    Ich habe noch eine Kleine Frage:
    Wenn man einen Pointer erstellt wird dabei eine eigene Variable erstellt.
    In dieser Variable speichert man die Speicheradresse (&) der anderen Variable ab.
    In der Speicheradresse steht ein x (0x7ffc4f33300) Integer können doch nur Zahlen speichern, wie ist das möglich?
    int Zahl = 100;
    int* Pointer1 = &Zahl;
    std::cout

    • @i.e.4961
      @i.e.4961 ปีที่แล้ว

      0x bedeutet so viel wie: das was danach kommt ist in Hexadezimalem Zahlensystem. (ist ein anderes Zahlensystem sowie z.B. Binär ist ja 01010101)

  • @dominikernst3732
    @dominikernst3732 9 ปีที่แล้ว +2

    Aber eine gewisse Ähnlichkeit zu Referenzen gibt es doch schon, denn wenn man doch das & vor die Variable beim Funktionsaufruf schreibt, dann wird ja nicht der Wert sondern die Adresse übergeben, oder? Da dann ja in der Funktion der Wert an der Adresse der Variable verändert wird und somit auch der Wert der Variable, oder?

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว

      Dominik Ernst Man kann das gleiche Verhalten sowohl mit Pointern als auch Referenzen erreichen, das stimmt. Der unterschied liegt in der Betrachtung was passiert. Beim einen wird die Speicheradresse übergeben, beim andern die Variable selbst. Unter der Haube wird natürlich trozdem in beiden Fällen die Speicheradresse übergeben, aber der Programmierer bekommt im einen Fall eben nichts davon mit.
      MfG

    • @dominikernst3732
      @dominikernst3732 9 ปีที่แล้ว

      Ah okay, danke für die Antwort

  • @hotfruit8083
    @hotfruit8083 9 ปีที่แล้ว +1

    mal ne frage sind eigendlich die Speicheradressen all vordefionniert das würde ja bedeuten das die ja auch noch gespeichert werden müssen un das ist echt viel platz.Oder werden die Speicheradressen immer je nach Programm vom Prozessor manuel zugewiesen. Würde mich über eine antwort freuen.

    • @LawnMeower
      @LawnMeower 6 ปีที่แล้ว

      Jeder Prozess erhält gewisse Speicherbereiche (Memory Regions). Diese werden beim Start eines Programms festgelegt (Größe, Zugriffsrechte, Start, Ende). Im Stack befinden sich automatisch generierte Pointer, damit der Kernel weiß, wo er hinspringen muss, um das Programm auszuführen

  • @maksimrotmann8861
    @maksimrotmann8861 9 ปีที่แล้ว

    Minute 5:40.. ich wollt grad fragen.. "Mensch, was bringt das denn bitte?"
    Aber gut, bin ich mal gespannt ^^
    Dafür andere Fragen:
    1. warum sind pointer wieder datentyp abhängig? Nur zur Sicherheit, und halt damits type safe ist?
    2. Kann ich einen Pointer auf eine x beliebige speicheradresse machen? Also kann ich einfach irgendeinen stuff meines arbeitsspeichers manipulieren, und damit eventuell das betriebssytem zum absturz bringen oder sonst was? Oder gibts da irgendwie nen scope oder so, sodass ich nur auf den bereich zu greifen kann in dem quasi mein programm läuft?
    3. Frage 2 nochmal, aber das gleiche mit arrays - geht das? zB die stelle des zugriffs so ändern, das ich "aus meinem programm raus bin" ?
    4. Was passiert eigentlich, (ja ich kanns auch ausprobieren.. mach ich wohl gleich mal.. aber trotzdem..) wenn man variablen "überlaufen" lässt? zB in ints zu große werte speichert (durch zB inkrementierung) ? Bei java springt die zahl ja einfach ins negative über..

    • @jankramer5103
      @jankramer5103 9 ปีที่แล้ว

      1.) ja zur Sicherheit , wobei es da so etwas wie void pointer in c gibt , die dann Typ unabhängig sind wird zum Beispiel in der c Funktion malloc verwendet so weit ich weiß ...
      2.) es gibt eine Begrenzung , und zwar laufen quasi alle Programme im Computer unabhängig von einander (virtual mode der CPU ) . dabei bekommt jedes Programm quasi seinen eigenen Arbeitsspeicher und hat auch nur rechte darin ... Ist jetzt noch nicht so genau erklärt von mir aber vll hilfts schon weiter ...
      3.) ja auch bei arrays muss man da aufpassen (wurde schon im Video zu c arrays gesagt) aber intern macht der []operator bei den c arrays nix anderes als den pointer um die größe des Datentyps zu erhöhen und wenn das halt nicht mehr in dem array drin ist Pech ... Als würdest du den pointer irgendwohin in den RAM (deines Programms ) zeigen lassen ... Führt dann meistens früher oder später zum Absturz ...
      4.) ja integer aller größen kannst du überlaufen lassen sollte gleich sein wie in Java ...

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว

      Maksim Rotmann Grundsätzlich stimmt alles was Jan Krae gesagt hat. Außer 4.:In C++ ist der überlauf von Variablen im Standard nicht definiert! Das heißt C++ legt hier kein Verhalten fest, es könnte theoretisch also alles passieren. Die meisten Compiler handeln das dann aber ähnlich wie Java. Dennoch sollte man aufpassen, um Plattformunabhängig zu bleiben, niemals in so einen Fall zu laufen.In solchen Sachen unterscheidet sich C++ und Java einfach deutlich. In Java kann man etwas einfach testen und weiß danach die Antwort, wie es in Java nun ist. In C++ hast du nur die Antwort was dein Compiler in dieser Situtation mit den gegebenen Einstellungen macht. Ob das nun definiertes Verhalten ist kannst du nur rausfinden, indem du im Standard nachliest (oder danach googlest).Void Pointer bekommen übrigens noch ihre eigene Episode (36).

    • @mattze90th
      @mattze90th 9 ปีที่แล้ว

      ***** da mus ich wiedersprechen, es ist schon definiert, nur halt nicht im c++ da es bereits im zweierkomplement definiert ist, also so wieder computer zahlen speichert.
      das ganze kann man sich wie ein kariertes blat papier vostellen. wenn ich 4 karos zur verfuegung habe kann ich dort werte von +999 bis -999 drinne speichern. da der computer nur 0 und einsen kennt waeren das bei 4 karros +111 bis -111 und da das vorzeichen auch als 0 und 1 dargestellt werden muss haben alle positiven zahlen eine fuehrende 0 und negative zahlen eine fuehrende 1.
      wir haben jetzt also volgende binaere zahlen:
      0000 -> +0
      1111 -> -1 (unsigned 15)
      1110 -> -2 (unsigned 14)
      1101 -> -3 (unsigned 13)
      1100 -> -4 (unsigned 12)
      1011 -> -5 (unsigned 11)
      1010 -> -6 (unsigned 10)
      1001 -> -7 (unsigned 9)
      1000 -> -8 (unsigned 8)
      0111 -> +7
      0110 -> +6
      0101 -> +5
      0100 -> +4
      0011 -> +3
      0010 -> +2
      0001 -> +1
      0000 -> +0
      wie einem jetzt vieleicht auffaelt haben wir ansich erst einen ueberlauf von -1 zur +0.
      das verhalten ist hier genau so wie der cast von float auf int, nachkommerstellen werden abgeschnitten, so wie alles was nicht in die 4 bit heneinpasst verfaellt.
      warum grade zweierkomplement, computer koennen nicht subtrahieren nur addieren, wenn etwas subtrahiert wird wird das zweierkomplement addiert, also bei 5-2 macht der computer dadraus 5+(-2) oder in binaerer form bei 4 bit 0101+1110 = 0011
      und bei unsigned wird der computer angewiesen das vorzeichenbit nicht mehr als vorzeichen zu betrachten so das es nur noch positive zahlen gibt dafuer aber doppelt so viel positive zahlen.
      wir haben bei c++ also sehrwohl einen sehr genaue definition was bei einem speicherueberlauf passiert, dies passiert aber nicht auf compiler ebene sondern auf maschienenebene weshalt es nicht in der c++ definition definiert werden muss.
      warum es bei java definiert ist kann ich nur vermuten, da ich bei java nicht so viel erfahrung habe. bei java laeufen die programme ja in der javaeigenen vm und nicht direckt auf der maschiene, so dass das verhalten in der vm nicht vorhersehbar ist und deswegen im compiler definiert werden muss.
      hoffe das is so einigermassen verstaendlich erklaert

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว

      mattze90th Der Prozessor muss aber nicht das zweierkomplement benutzen! Das ist zwar heute Standard und benutzten wirklich 99% aller Prozessoren aber es gibt immer noch randgebiete in denen das einerkomplement oder "sign and magnitude" verwendet werden. Daher kann der Standard dazu nichts sicher sachen, ergo ist es nicht definiert.
      Zwar kannst du davon ausgehen, dass das zweierkomplement benutzt wird und in den meisten Fällen hast du damit auch absolut recht. Aber irgendwann knallt es dann halt. Mir ist auch klar, dass deine Version an den meisten Schulen/Hochschulen/Unis gelehrt wird. Der Standard hat hier aber nunmal recht, siehe Paragraph 4 und 5.

  • @TheKraiburgBoy
    @TheKraiburgBoy 9 ปีที่แล้ว

    Kann man Pointer von Pointern machen?

  • @gigagames21
    @gigagames21 9 ปีที่แล้ว

    Du nimmst ja int* warum nicht IntPtr ? (ist ja wenn ich micht nicht irre dafür, um pointer zu speichern) ?!

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว +1

      ***** Keine Ahnung was IntPtr sein soll, aber vom Standard ist das nicht. Das wird irgendwas spezielles von irgendeinem Compiler sein.

    • @gigagames21
      @gigagames21 9 ปีที่แล้ว

      ***** msdn.microsoft.com/de-de/library/system.intptr(v=vs.110).aspx

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว +1

      ***** Vorsicht, das ist das .net framework! Das ist nicht teil von c++.

  • @TheRealCr4xy
    @TheRealCr4xy 9 ปีที่แล้ว +2

    Danke, danke und nochmals: danke.

  • @moobkj
    @moobkj ปีที่แล้ว

    Sehr sehr starkes Video !

  • @firstmanpower4736
    @firstmanpower4736 5 ปีที่แล้ว

    Um... Why c++ address start from 0x004...?

  • @anhthiensaigon
    @anhthiensaigon 6 ปีที่แล้ว

    Java hat keinen Pointer, wie soll man dann unter NullPointerException verstehen?

    • @Brotcrunsher
      @Brotcrunsher  6 ปีที่แล้ว +3

      Weil die Javeentwickler an dieser Stelle innerhalb ihrer eigenen Terminologie inkonsistent waren.

  • @Elih-21
    @Elih-21 2 ปีที่แล้ว

    Kleiner Tipp using namespace sdt erspart dir dieses ganz3 std :: cout .. usw

    • @Brotcrunsher
      @Brotcrunsher  2 ปีที่แล้ว

      Siehe mein Video "C++ Bonus [001] - Wieso nicht "using namespace std" nutzen"

  • @isabelanbe1166
    @isabelanbe1166 7 ปีที่แล้ว

    und was passiert wenn du nur pointer =15 hin schreibst?

  • @PMakerYT
    @PMakerYT 9 ปีที่แล้ว

    Lustig wie du zuerst von 8 GB RAM und dann von 32 bit redest ;-) Nichtsdestotrotz sehr gut erklärt!

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว

      PMakerYT Das eine schließt das andere ja nicht zwangsläufig aus. Nur ein 32 PROGRAMM kann eben nicht alle 8 gb des SYSTEMS nutzen.

    • @maksimrotmann8861
      @maksimrotmann8861 9 ปีที่แล้ว

      ***** naja, da das betriebssystem (wenigstens windows) in 32 bit eben auch keine 8 gigabyte benutzen kann... schließt sich das letzten endes doch aus ;)

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว

      Maksim Rotmann deswegen habe ich System groß geschrieben ;)

  • @the-karabin
    @the-karabin 9 ปีที่แล้ว

    Kann man statt
    int zahl = 100;
    int* pointer = &zahl;
    *pointer = 15;
    auch
    int zahl = 100;
    *&zahl = 15;
    schreiben?
    Man könnte natürlich einfach
    zahl = 15;
    schreiben aber mir geht es ums Prinzip ;)

    • @Brotcrunsher
      @Brotcrunsher  9 ปีที่แล้ว

      KarabinLP Ich GLAUBE das müsste gehen. Habs aber noch nie probiert, weil man das in der Praxis natürlich nicht braucht, eben so wenig hab ich im Standard nachgelesen ;)

  • @calmquoties
    @calmquoties 3 ปีที่แล้ว

    Danke mann! Richtig gut!

  • @malino24-souls
    @malino24-souls 6 ปีที่แล้ว

    wobei der RAM ja auch matrizenartig angeordnet ist, also kein 8 Mio.-Turm wäre ;)

    • @malino24-souls
      @malino24-souls 6 ปีที่แล้ว

      aber egal, nur so am Rande xD

    • @Brotcrunsher
      @Brotcrunsher  6 ปีที่แล้ว

      Ich weiß nicht was du damit meinst. Doch er ist, aus logischer Sicht, ein 8 Millionen Turm in diesem Fall. Meinst du vielleicht die Memorypages des Betriebssystems?

    • @malino24-souls
      @malino24-souls 6 ปีที่แล้ว

      soweit ich weiß, ist RAM matrizenartig angeordnet, also mit Zeile und Spalte, also ist es ja ne Tabelle und keine eindimensionale Ansammlung von Werten

    • @Brotcrunsher
      @Brotcrunsher  6 ปีที่แล้ว

      Nein ist er nicht.

    • @malino24-souls
      @malino24-souls 6 ปีที่แล้ว

      www.elektronik-kompendium.de/sites/com/0701281.htm

  • @Ufuk646
    @Ufuk646 5 ปีที่แล้ว

    echt gelungene Erklärung

  • @Bob6fjhfhjjhd9696hfhfhjfdnndj
    @Bob6fjhfhjjhd9696hfhfhjfdnndj 5 ปีที่แล้ว

    Ehrenmann

  • @aaron32190
    @aaron32190 7 ปีที่แล้ว

    Erstmal:
    Nein das bin nicht ich auf meinem Profilbild (einfach weil man ja öfters als Kiddie dargestellt wird oder so), sondern ein Google-Bilder Bild.
    Nun zu meiner Frage:
    Ist es also so, dass wenn ich
    int bla = 100;
    int bla = 200;
    schreibe, 2 verschiedene Speicherzellen benötigt werden?
    Wenn ich mit pointern arbeite jedoch nur 1, weil ich sie überschreibe?

    • @ew5781
      @ew5781 6 ปีที่แล้ว +2

      Kiddie