Aufgabe zu Zeiger

Tutorials.at
Verfügbare Informationen zu "Aufgabe zu Zeiger"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Joe - Xin - wirthi - detewe89
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 8
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Aufgabe zu Zeiger
  • Letzte Antwort: vor 16 Jahren, 4 Monaten, 11 Tagen, 8 Stunden, 54 Minuten
  • Alle Beiträge und Antworten zu "Aufgabe zu Zeiger"

    Re: Aufgabe zu Zeiger

    Joe - 11.12.2007, 11:34

    Aufgabe zu Zeiger
    Hallo

    short v[] = { 0, 10, 20 },
    *ptr1 = v, *ptr2 = v+2;}

    Welchen wert hat:
    ptr2 -ptr1

    Für eine Erläuterung wäre ich sehr Dankbar!!



    Re: Aufgabe zu Zeiger

    Xin - 11.12.2007, 19:26

    Re: Aufgabe zu Zeiger
    Joe hat folgendes geschrieben: Hallo

    short v[] = { 0, 10, 20 },
    *ptr1 = v, *ptr2 = v+2;}

    Welchen wert hat:
    ptr2 -ptr1

    2*sizeof( short ).
    Also vermutlich 4.
    Kannst Du das nicht einfach kompilieren und den Compiler fragen?
    Anschließend sitzt Du vor die 4 und überlegst, warum der Compiler 4 ausgibt?

    Joe hat folgendes geschrieben: Für eine Erläuterung wäre ich sehr Dankbar!!

    Ich vermutete derartiges schon.

    Also Du hast ein Array von Shorts. Ein Short ist (mindestens) 2 Byte lang. Dein Array ist also (mindestens) 6 Byte groß. Angenommen Dein Array liegt an Speicherstelle 2000 und ein Short ist 2 Byte groß, dann liegt das erste Short auf Adresse 2000 und 2001, das zweite auf 2002 und 2003, das dritte auf 2004 und 2005.

    Du initialisierst den ersten Pointer auf den Anfangspunkt des Arrays, also hier 2000.
    Den zweiten Pointer auf den Anfangspunkt des Arrays + 2 Shorts - es ist ja ein Short-Array. 2 Shorts sind (mindestens) 4 Byte. Der Zweite Pointer ist damit 2000 + 2*sizeof( short ) = 2004.

    Ziehst Du nun den ersten Pointer vom zweiten ab, also 2004-2000 ist das Ergebnis (mindestens) 4.

    Warum mindestens? C garantiert nicht sonderlich viel. Ob ein Byte 8, 9 oder 10 Bits, garantiert Dir niemand. Wie groß ein Short ist, wer weiß das schon so genau. int zum Beispiel ist heutzutage in der Regel 4 Byte groß und long ebenfalls 4. Früher war int typischerweise 2 Byte groß, long 4. Die 64 Bit CPUs werden aus long vermutlich bald 8 Byte machen, aber man sollte sich nicht darauf verlassen, es könnte ja auch sein, dass es doch nur 4 Byte sind...
    Darum gibt's in C99 inzwischen Datentypen, die sich da genauer festlegen.

    Die einzig allgemeingültige Antwort kann also eigentlich nur 2 * sizeof( short ) lauten.



    Re: Aufgabe zu Zeiger

    wirthi - 11.12.2007, 19:44

    Re: Aufgabe zu Zeiger
    Zitat: 2*sizeof( short ).
    Also vermutlich 4.

    Sorry, da muss ich widersprechen.
    Code: *ptr1 = v;
    füllt den Inhalt von prt1 mit der Adresse von v, der (in short gelesen) 0 ist (erstes Element).
    Code: *ptr2 = v+2;
    füllt den Inhalt von prt2 mit der Adresse von v, addiert allerdings zuvor 2.

    Da v natürlich gleich wie v ist, ergibt ptr1-prt2 dann -2.



    Re: Aufgabe zu Zeiger

    detewe89 - 11.12.2007, 21:09


    Korrigiert mich, wenn ich da falsch liege, aber bei mir wirft der GCC da sofort Warnungen aus:
    Code: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
    Man kann doch nicht dem Inhalt der Variable, auf die ptr1 zeigt, eine Adresse zuweisen! Müsste der Befehl nicht so heißen:
    Code: ptr1 = v;
    Also ohne den Referenzoperator (*) ???


    Außerdem erhalte ich ein Segmentation fault bei der *ptr1 = v - Anweisung, da ja der Inhalt von ptr1 selber noch gar nicht festgelegt wurde (wohin zeigt denn ptr1 überhaupt - wurde noch nicht festgelegt!).
    Übrigens: Die Anweisungen
    Code: ptr1 = v;
    ptr2 = &v[0];
    Ergeben genau dasselbe Ergebnis.


    Gruß,
    Daniel



    Re: Aufgabe zu Zeiger

    wirthi - 11.12.2007, 21:24


    Im Sourcecode, den Joe gepostet hat, war das aber keine zuweisung, sondern eine Initialisierung. Damit war es in diesem Fall kein Referenzoperator, sodern die Information an den Compiler, hier einen Pointer und keine Wert-Variable anzulegen.



    Re: Aufgabe zu Zeiger

    Xin - 11.12.2007, 22:53

    Re: Aufgabe zu Zeiger
    wirthi hat folgendes geschrieben: Zitat: 2*sizeof( short ).
    Also vermutlich 4.

    Sorry, da muss ich widersprechen.
    Gut erkannt, die 4 ist falsch...

    wirthi hat folgendes geschrieben: Code: *ptr1 = v;
    füllt den Inhalt von prt1 mit der Adresse von v, der (in short gelesen) 0 ist (erstes Element).
    ...aber bei der Begründung war das definitiv ein Glückstreffer. ^^

    wirthi hat folgendes geschrieben: Code: *ptr2 = v+2;
    füllt den Inhalt von prt2 mit der Adresse von v, addiert allerdings zuvor 2.

    Da v natürlich gleich wie v ist, ergibt ptr1-prt2 dann -2.
    Auch da widerspreche ich, obwohl Dein Ergebnis richtig ist. Es wird nicht zwei Addiert, es wird 2*sizeof( short ) addiert.

    Code:
    xin@morpheus:~/Personen/tutorials.at$ cat pointer.c
    #include "stdio.h"

    int main( void )
    {
      short v[] = { 0, 10, 20 }, *ptr1 = v, *ptr2 = v+2;

    /*
    Welchen wert hat:
    ptr2 -ptr1
    */

      printf( "ptr1: %x\nptr2: %x\nptr2-ptr1: %d\n", ptr1, ptr2, ptr2-ptr1 );
    }
    xin@morpheus:~/Personen/tutorials.at$ gcc pointer.c
    xin@morpheus:~/Personen/tutorials.at$ ./a.out
    ptr1: bfa8fd46
    ptr2: bfa8fd4a
    ptr2-ptr1: 2
    xin@morpheus:~/Personen/tutorials.at$


    Auf Deutsch: Die Pointer liegen wie von mir behauptet 4 Byte auseinander. Für die Hex-Legastheniker unter uns: a ist 10 und a-6 = 4. Da es aber short-Pointer sind, sind die Pointer nicht 4 Byte auseinander, sondern 2 Shorts (was wiederum 4 Bytes entspricht). Damit stimmt zwar Dein Ergebnis im Gegensatz zu meinem, aber Deine Begründung für das Ergebnis nicht.
    Einigen wir uns darauf, dass wir es gemeinsam falsch gemacht haben, es keiner richtig ausprobiert hat, bevor er das Forum zumüllte und dass man gemeinsam am Schluss doch das Ziel erreicht hat.



    Re: Aufgabe zu Zeiger

    wirthi - 11.12.2007, 23:31


    Ausprobiert hab ich's, rauskommen tut ja -2 :-) Bei der Begründung hast aber recht; ich weiß, warum ich C schon lange hinter mit gelassen habe und lieber Java programmiere, das ist summa summarum logischer ;-)



    Re: Aufgabe zu Zeiger

    Xin - 12.12.2007, 00:42


    wirthi hat folgendes geschrieben: Ausprobiert hab ich's, rauskommen tut ja -2 :-) Bei der Begründung hast aber recht; ich weiß, warum ich C schon lange hinter mit gelassen habe und lieber Java programmiere, das ist summa summarum logischer ;-)

    Ich habe die Ehre nun Java programmieren zu dürfen. Eigentlich habe ich 2001, als ich ein Projekt mit Java durchzog, geschworen Java nie mehr anzupacken.

    Ehrlich gesagt, seitdem ich wieder Java programmiere, empfinde ich seitdem C++ zu programmieren sehr entspannend, weil C++ vergleichsweise extrem einfach ist - die Regeln konsequent durchgezogen werden (was eben auch bedeuten kann, dass es Ärger gibt, wenn man sich nicht dran hält). Wer sich an die Regeln hält, bekommt dafür sicherer laufende Programme als in Java (vgl. Referenzen, Templates...)

    Java empfinde ich im Vergleich als Katastrophe. Vor allem, weil Java aus den Fähigkeiten des vorhandenen C++ hätte lernen können und die wichtigen Sachen, wurden gekonnt ignoriert.

    Das Einzige, was in Java gut ist, ist das Framework... das heißt, die Existenz des Frameworks. Das Framework ist ebenfalls eine Katastrophe, aber immerhin muss man es nicht selbst schreiben, wenn man es erträgt.

    Ich baue mir inzwischen ein Framework in C++ auf. Java ist in meinen Augen ein großer Rückschritt, der lediglich zu selten bemerkt wird, weil das beiliegende Framework Entwicklung beschleunigt im Vergleich zu Standard-C++ ohne ein entsprechendes Framework. Von der Sprache her, fördert es imho die Verblödung der Entwickler, denn die Mehrzahl der Java-Entwickler fragt sich nicht, warum oder wie etwas funktioniert, was im Framework existiert. Es ist da, es war da, man hat es nie selbst mal nach eigenen Ansprüchen geschrieben.

    Schade eigentlich.



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    farbe in Fenstern - gepostet von metzel-monkey am Montag 29.05.2006
    Geschachtelte Schleifen - gepostet von Kimi am Donnerstag 29.11.2007
    Hilfe!!! - gepostet von Schubl am Samstag 29.04.2006
    Umrechner Arabische in Römische Zahlen - gepostet von Walgo am Donnerstag 19.07.2007
    Datei einlesen - gepostet von Blümchen am Mittwoch 07.02.2007
    Welche Programmiersprache? - gepostet von The Dust am Sonntag 24.06.2007
    Kleine Frage zu If-Else - gepostet von The Dust am Samstag 24.11.2007
    Windowsoberfläche bei C++ Programmierung - gepostet von kismoh am Dienstag 13.02.2007
    Adventskalender - gepostet von vpascal am Sonntag 11.11.2007



    Ähnliche Beiträge wie "Aufgabe zu Zeiger"

    Beispiellösung: Übung 7, Aufgabe 1 (Binomialkoeffizient) - NVD (Freitag 08.12.2006)
    Aufgabe 7 - xfire64 (Freitag 10.11.2006)
    Aufgabe Betriebssystem - schell (Montag 07.11.2005)
    Zettel Nr 6 Aufgabe 23a - ahnungslos (Mittwoch 30.05.2007)
    [audio] Ring Ring (extended version) - ABBAinter.net (Samstag 02.06.2012)
    Aufgabe 3 - herbertnrw (Montag 17.10.2005)
    Kleine Aufgabe - Zooyo (Donnerstag 26.10.2006)
    Merlucs Aufgabe - Miranillinia (Sonntag 26.03.2006)
    Zettek 6 aufgabe 24 - daniel (Donnerstag 31.05.2007)
    KT I Aufgabe 6 - Dörksen (Montag 16.01.2006)