Verfügbare Informationen zu "Aufgabe zu Zeiger"
Qualität des Beitrags: 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:34Aufgabe 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:26Re: 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:44Re: 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:53Re: 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)