Zeiger

Schnelle objektorientierte, kompilierende Programmiersprache.
mvp_1991
Beiträge: 13
Registriert: Di Apr 19, 2016 9:57 pm

Zeiger

Beitrag von mvp_1991 » Mi Apr 27, 2016 12:49 am

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger

Beitrag von Xin » Mi Apr 27, 2016 11:26 am

Code: Alles auswählen

int a , b , c , ∗ p1=&a , ∗ p2=&b , ∗ p3=&c ;
a = b = c = 1 ;
Alles ist 1. ^^

Code: Alles auswählen

∗p1 = a + b + c ;
Rechts wird zuerst ausgerechnet. 1+1+1 ist 3 und wird dahin geschrieben, wohin p1 zeigt, p1 zeigt auf a. => a = 3;

Code: Alles auswählen

∗p2 = ∗p1 + ∗p2 + ∗p3 ;
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.

Code: Alles auswählen

∗p3 = ∗p1 + 1 + 2 ∗∗p2 ;
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.

Code: Alles auswählen

printf( "a=%d, b=%d, c=%d\n", a, b, c );
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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mvp_1991
Beiträge: 13
Registriert: Di Apr 19, 2016 9:57 pm

Re: Zeiger

Beitrag von mvp_1991 » Do Apr 28, 2016 5:02 pm

Es kommt der Wert 14 raus, da *p1 = 3 und 2 * *p2 = 10

Dementsprechend 3 + 1 + 2*5 =14

mvp_1991
Beiträge: 13
Registriert: Di Apr 19, 2016 9:57 pm

Re: Zeiger

Beitrag von mvp_1991 » Do Apr 28, 2016 5:34 pm

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?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger

Beitrag von Xin » Do Apr 28, 2016 5:51 pm

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mvp_1991
Beiträge: 13
Registriert: Di Apr 19, 2016 9:57 pm

Re: Zeiger

Beitrag von mvp_1991 » Do Apr 28, 2016 8:45 pm

und wie groß ist dieser Bereich in Zahlen ausgedrückt? Muss ich da den normalen int-Bereich mal 3 nehmen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger

Beitrag von Xin » Do Apr 28, 2016 9:18 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mvp_1991
Beiträge: 13
Registriert: Di Apr 19, 2016 9:57 pm

Re: Zeiger

Beitrag von mvp_1991 » Do Apr 28, 2016 10:37 pm

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;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zeiger

Beitrag von Xin » Fr Apr 29, 2016 7:56 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mvp_1991
Beiträge: 13
Registriert: Di Apr 19, 2016 9:57 pm

Re: Zeiger

Beitrag von mvp_1991 » Fr Apr 29, 2016 9:07 am

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?

Antworten