Seite 1 von 2
Zeiger
Verfasst: Mi Apr 27, 2016 12:49 am
von mvp_1991
Hallo, ich habe das Thema Zeiger noch nicht so verstanden :/
Code: Alles auswählen
int a , b , c , ∗ p1=&a , ∗ p2=&b , ∗ p3=&c ;
a = b = c = 1 ;
∗p1 = a + b + c ;
∗p2 = ∗p1 + ∗p2 + ∗p3 ;
∗p3 = ∗p1 + 1 + 2 ∗∗p2 ;
Kann mir jemand erklären was für Werte a.b und c am Ende haben?
Edit by Xin: Code Tags hinzugefügt
Re: Zeiger
Verfasst: Mi Apr 27, 2016 11:26 am
von Xin
Code: Alles auswählen
int a , b , c , ∗ p1=&a , ∗ p2=&b , ∗ p3=&c ;
a = b = c = 1 ;
Alles ist 1. ^^
Rechts wird zuerst ausgerechnet. 1+1+1 ist 3 und wird dahin geschrieben, wohin p1 zeigt, p1 zeigt auf a. => a = 3;
Rechts wird zuerst ausgerechnet. Da wo p1 hinzeigt (a == 3) addiert mit dem, wo p2 hinzeigt (b == 1) addiert mit dem wo p3 hinzeigt (c == 1), ergibt 5, das wird dahin geschrieben, wo p2 hinzeigt: b=5.
Jetzt bist Du dran. Was kommt raus?
Kann mir jemand erklären was für Werte a.b und c am Ende haben?
Ja, natürlich darfst Du hier weiterhin Fragen stellen und es ist auch keine Frage zu blöd oder so, aber ich möchte Dir eine weitergehende Antwort geben:
Gib die Werte doch einfach mal mit printf aus.
Und dann guck, was Du verstanden hast und ob das raus kommt, was Du selbst denkst. Und wenn dann etwas rauskommt, was Du Dir nicht erklären kannst, dann hast Du auch das Forum hier. Schreib auf, wie Du Dir das erklärst und was deine Erwartung ist und zeig auf, was stattdessen rauskommt.
Programmieren lernen heißt vorrangig debuggen lernen. Wenn wir das im einzelnen übernehmen, lernst Du nur Zeilen hintereinander weg zu schreiben.
Re: Zeiger
Verfasst: Do Apr 28, 2016 5:02 pm
von mvp_1991
Es kommt der Wert 14 raus, da *p1 = 3 und 2 * *p2 = 10
Dementsprechend 3 + 1 + 2*5 =14
Re: Zeiger
Verfasst: Do Apr 28, 2016 5:34 pm
von mvp_1991
int ∗p = c a l l o c ( 3 , s i z e o f ( int ) ) ;
∗( p+1) = 10;
∗( p+2) = 20;
Verstehe ich das richtig, dass der Speicherbereich den *p referenziert 3 Int-Variablen beträgt?
Re: Zeiger
Verfasst: Do Apr 28, 2016 5:51 pm
von Xin
mvp_1991 hat geschrieben:Es kommt der Wert 14 raus, da *p1 = 3 und 2 * *p2 = 10
Dementsprechend 3 + 1 + 2*5 =14
Passt doch
mvp_1991 hat geschrieben:Code: Alles auswählen
int ∗p = c a l l o c ( 3 , s i z e o f ( int ) ) ;
∗( p+1) = 10;
∗( p+2) = 20;
Verstehe ich das richtig, dass der Speicherbereich den *p referenziert 3 Int-Variablen beträgt?
Yepp.
Siehe auch:
calloc
Re: Zeiger
Verfasst: Do Apr 28, 2016 8:45 pm
von mvp_1991
und wie groß ist dieser Bereich in Zahlen ausgedrückt? Muss ich da den normalen int-Bereich mal 3 nehmen?
Re: Zeiger
Verfasst: Do Apr 28, 2016 9:18 pm
von Xin
mvp_1991 hat geschrieben:und wie groß ist dieser Bereich in Zahlen ausgedrückt? Muss ich da den normalen int-Bereich mal 3 nehmen?
calloc( 3, sizeof ( int ) ) ist nicht anderes als malloc( 3 * sizeof( int ) ).
int ist auf den meisten Maschinen 4 Byte, also werden (auf den meisten Maschinen) 12 Byte alloziiert.
Re: Zeiger
Verfasst: Do Apr 28, 2016 10:37 pm
von mvp_1991
werden durch folgende Codezeile die drei ganzzahligen Variablen a,b,c deklariert und mit Werten initalisiert, die in dem durch p referenzierten Speicherbereich sind?
*(p+1) = 10; *(p+2) = 20; *(p+3) = 30;
Re: Zeiger
Verfasst: Fr Apr 29, 2016 7:56 am
von Xin
mvp_1991 hat geschrieben:werden durch folgende Codezeile die drei ganzzahligen Variablen a,b,c deklariert und mit Werten initalisiert, die in dem durch p referenzierten Speicherbereich sind?
*(p+1) = 10; *(p+2) = 20; *(p+3) = 30;
Kommt drauf an, wo p hinzeigt. Eher nicht.
Ein Array fängt immer bei Null an.
Hast Du Dir das Tutorial mal durchgelesen? Schau Dir da mal die Kapitel über Arrays und C-Strings an.
Re: Zeiger
Verfasst: Fr Apr 29, 2016 9:07 am
von mvp_1991
int ∗p = c a l l o c ( 3 , s i z e o f ( int ) ) ;
for ( int i =0; i <3; i ++){
∗( p+i ) = 3−i ;
}
int a , b , c ;
a = ∗p ;
p++;
b = ∗p ;
p++;
c = ∗p ;
Kann mir jemand erklären, wieso der Parameter a am Ende den Wert 3 hat?