mercadom Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 Hi, ich lerne im Moment Arrays. Ich bin noch ein Anfänger zu dem Thema und zum lernen, mache ich Copy Paste von im Internet erstellten Programmen und versuche zu verstehen, was genau jedes Ding macht. Bei folgenden Programm habe ich versucht, genau zu verstehen, was das macht. Dennoch ohne erfolg. Was ich nicht weiss, was das genau macht, habe ich mit RoteFarbe gekennzeichnet. Ich hoffe, jemand kann mir damit helfen. #include <stdio.h> int main(void) { int a[4] = { 0, 1, 2, 3 }; int *ip; int i; for ( i=0; i<4; i++ ) printf("%d ", a); // was bedeutet a printf("\n"); ip = a; for ( i=0; i<4; i++ ) printf("%d ", *ip++); // was bedeutet *ip++ printf("\n"); ip = a; for ( i=0; i<4; i++ ) printf("%d ", *(ip+i)); // was bedeutet *(ip+i) printf("\n"); for ( i=0, ip=a; i<4; i++, ip++ ) printf("%d ", *ip); // was macht for ( i=0, ip=a; i<4; i++, ip++ ) printf("\n"); ip = &a[0]; // was bedeutet ip = &a[0]; for ( i=0; i<4; i++ ) printf("%d ", ip); // was bedeutet ip printf("\n"); return 0; } Zitieren
Wuwu Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 ein paar begriffe zum googlen: arrayindex, inkrementor, pointer, for schleife Zitieren
lilith2k3 Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 (bearbeitet) Galileo Computing :: C von A bis Z 11 Arrays Galileo Computing :: C von A bis Z 12 Zeiger (Pointer) Nebenbeigesagt finde ich den Code unschön. Bearbeitet 28. Dezember 2010 von lilith2k3 Zitieren
laubi Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 nun, arrays basieren eig komplett auf zeigern (pointern) um es wirklich zu verstehen hilft nicht nur anschauen sondern auch lernen > Galileo Computing :: C von A bis Z – 11 Arrays nun zum quellcode, solltest du das darüber gelesen (und verstanden) haben sollten sich eig die fragen von alleine klären, aber ich machs einfach mal. int a[4] ={0,1,2,3}; //das bedeutet das ein feld mit 4 integer-elementen reserviert wird. //a ist der zeiger auf das erste element //int *ip ist ein zeiger auf eine zufallsadresse da er noch nicht zugewießen wurde //int i; sollte klar sein. for ( i=0; i<4; i++ ) printf("%d ", a); // was bedeutet a printf("\n"); also sehen wir uns mal die schleife an.. wie wird exakt 4 mal durchgegangen, das sollte klar sein. und jedesmal wird auf ein element im array zugegriffen, also so siehts eig aus ohne schleife: printf("%d ", a[0]);//ein array beginnt IMMER mit 0, fängt man mit 1 an kommen fehler. printf("%d ", a[1]); printf("%d ", a[2]); printf("%d ", a[3]);//das letzte element das bedeutet das zuerst auf das erste element des arrays zugegriffen wird, dann das 2te, dritte und vierte. damit kommt folgene ausgabe: 0123 dann kommen wir zu ip = a; da ip die adresse von a hat, kann es nun auch problemlos auf die elemente des arrays zugreifen. mit *ip++ wird nicht der wert erhöt sondern die ADRESSE somit (sagen wir mal die startadresse ist 0x12345678, ist die nächste natürlich 0x12345679, dann 0x12345680 ....) und so werden wieder die variablen ausgegeben. 0123 im nächsten fall ist wieder das selbe prinzip, allerdings wird ip nicht verändert, sondern wie bei a immer nur kurz erhöt. also wäre *(a+1) dasselbe wie a[1] oder eben *(ip+1) dasselbe wie ip[1] dann zum letzten: was bedeutet ip = &a[0]; & liefert ja die adresse einer variable oder eines zeigers zurück. indem fall liefert es die adresse auf den ersten wert zurück. damit kann man dann wieder problemlos mit ip darauf zugreifen. das sollte es eig sein, allerdings rate ich dir das du das kapitel im openbook sorgfälltig durchgehst, da arrays SEHR wichtig sind, und unerlässlich. lg Laubi Zitieren
mercadom Geschrieben 28. Dezember 2010 Autor Geschrieben 28. Dezember 2010 Hallo Wuwu, lilith2k3 und laubi, vielen Dank für die schnelle Antworten. Ich lese gerade die links von Galileo und versuche zu verstehen, was mir laubi gesagt hat. Ich verstehe es besser, aber ich kann jetzt keine konkrete Antwort geben. Ich schreibe morgen eine Nachricht, es gibt bestimmt mehr fragen. Zitieren
Klotzkopp Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 nun, arrays basieren eig komplett auf zeigern (pointern) Array und Zeiger sind unterschiedliche Dinge. Bitte nicht durcheinanderwerfen. //a ist der zeiger auf das erste elementNein, a ist der Name des Arrays. Arrays sind implizit in Zeiger auf den Elementtyp konvertierbar, der dabei entstehende Zeiger zeigt auf das erste Element. Zitieren
mercadom Geschrieben 28. Dezember 2010 Autor Geschrieben 28. Dezember 2010 Hi, jetzt verstehe ich besser die Arrays und die Begriffe "arrayindex, inkrementor, pointer, for schleife" Ich habe im Internet in dieser Zeit schon viele Programmen angeschaut, die ein Array definieren. Allerdings habe ich ein kleines Problem mit dem Verständniss von folgendes(was ich nicht verstehe steht mit Rot): #include <stdio.h> #include <stdlib.h> #define SIZE 10 int main(void) { int zahlen = { 0 }; printf("Anz. Elemente : %d\n", sizeof(zahlen) / sizeof(int)); return EXIT_SUCCESS; } meine Frage wäre...es ist für mich klar, was "sizeof(zahlen)" bedeutet. Aber wieso schreibt man auch "sizeof(int)" daneben? Wenn ich dieses "sizeof(int)" weg mache, dann erscheint der Wert 40. Woher kommt er? Ansonsten bin ich beim Lesen von dem Link Galileo Computing Arrays und dann will ich lesen das Kapitel von Pointern. Zitieren
carstenj Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 (bearbeitet) Hi, sizeof(zahlen) gibt die Größe des für das komplette Feld reservierten Speichers zurück, sizeof(int) die Größe einer Integervariablen auf deinem System. Allerdings stimmt das... es ist für mich klar, was "sizeof(zahlen)" bedeutet ...mit dieser Aussage... Woher kommt er? ...dann nicht überein. Bearbeitet 28. Dezember 2010 von carstenj Zitieren
mercadom Geschrieben 28. Dezember 2010 Autor Geschrieben 28. Dezember 2010 Danke für die Antwort carstenj. soll ich aber bei diesem Programm "sizeof(zahlen) / sizeof(int)" zusammenschreiben? kann man nicht nur sizeof(zahlen) im Programm stehen lassen? oder "sizeof(x) / sizeof(y)" muss immer so bei anderen Programmen stehen? Zitieren
Klotzkopp Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 soll ich aber bei diesem Programm "sizeof(zahlen) / sizeof(int)" zusammenschreiben? kann man nicht nur sizeof(zahlen) im Programm stehen lassen?Diese beiden Ausdrücke haben unterschiedliche Bedeutungen. Der sizeof-Operator liefert dir die Größe eines Typs oder Ausdrucks in Bytes. Wenn es das ist, was du wissen willst, dann lass das stehen. Wenn du aber wissen willst, wieviele Elemente ein Array hat, musst du diesen Wert noch durch die Größe eines einzelnen Elements in Bytes teilen. Ist dir der Unterschied klar? Zitieren
mercadom Geschrieben 28. Dezember 2010 Autor Geschrieben 28. Dezember 2010 Ich versuche mit eigenen Wörtern zu erklären, was du mit den Unterschied versteht. Der sizeof operator ist es mir schon klar, d. h. mit sizeof weiss ich in Bytes, wie gross ein Typ oder ein Ausdruck ist und wenn ich sage, "ok, ich will jetzt wissen, wie viele ELEMENTE ein Array hat", soll ich durch die GRÖSSE IN BYTES die Werte eines Elements teilen. Ich bin kein Deutschmuttersprachler, aber ich glaube, ich habe es richtig ausgedrückt. Allerdings verstehe ich noch nicht, ob die Elemente eines Arrays mit diesem sizeof(int) zu tun hat. Zitieren
Klotzkopp Geschrieben 28. Dezember 2010 Geschrieben 28. Dezember 2010 Allerdings verstehe ich noch nicht, ob die Elemente eines Arrays mit diesem sizeof(int) zu tun hat.Hat es. sizeof(int[10]) ist bei dir 40 (10*sizeof(int)). sizeof(double[10]) könnte 80 sein (10*sizeof(double)). sizeof(char[10]) ist 10 (10*sizeof(char), wobei sizeof(char) per Definition 1 ist). Größe des Arrays = Anzahl Elemente * Größe eines Elements <=> Größe des Arrays / Größe eines Elements = Anzahl Elemente Zitieren
Wuwu Geschrieben 29. Dezember 2010 Geschrieben 29. Dezember 2010 Ich versuche mit eigenen Wörtern zu erklären, was du mit den Unterschied versteht. Der sizeof operator ist es mir schon klar, d. h. mit sizeof weiss ich in Bytes, wie gross ein Typ oder ein Ausdruck ist und wenn ich sage, "ok, ich will jetzt wissen, wie viele ELEMENTE ein Array hat", soll ich durch die GRÖSSE IN BYTES die Werte eines Elements teilen. Ich bin kein Deutschmuttersprachler, aber ich glaube, ich habe es richtig ausgedrückt. Allerdings verstehe ich noch nicht, ob die Elemente eines Arrays mit diesem sizeof(int) zu tun hat. Überleg Dir mal ganz genau, was für Elemente und welche Datentypen Du in Deinem Beispiel im Array speicherst, vielleicht geht Dir dann ein Licht auf Zitieren
mercadom Geschrieben 30. Dezember 2010 Autor Geschrieben 30. Dezember 2010 Es ist für mich alles deutlicher, aber ich muss noch viel üben. Wo kann man Aufgabenblätter ¨von Arrays? ich meine...man kann hunderte Beispiele im Internet anschauen aber es ist auch wichtig, es nachzuweisen, was man im Moment lernt. Zitieren
carstenj Geschrieben 30. Dezember 2010 Geschrieben 30. Dezember 2010 Hi, ich behaupte mal, dass jetzt soooooo extrem viele Geheimnisse hinter Feldern (Arrays) nicht versteckt sind. Ob man da hunderte Aufgaben lösen muss, bezweifle ich. Außerdem kann man sich da ja einfach selber Beispiele zusammenstricken. Zitieren
mercadom Geschrieben 5. Januar 2011 Autor Geschrieben 5. Januar 2011 Hallo Leute, ich bin wieder hier. Ich habe mehr mit Arrays geübt und es läuft alles besser. Allerdings gibt es ein Beispiel, das ich im Internet fand und verstehe was das Programm macht, aber die Anweisungen sind nicht so klar für mich. Was mit Rot steht// UNBEKANNT gekennzeichnet ist, verstehe ich nicht. Was genau mit grün steht, verstehe ich schon. #include <stdio.h> // das ist die Standard Bibliothek int main( void ) //(diese ist der Anfang der Funktion) { float umsatz[7]; //Array mit Name umsatz und mit 7 Zellen float summe, hoechsterWert, niedrigsterWert;//Definition von 3 Variablen int i; //Definition vom Variable i for( i = 0; i < 7; ++i ) //7x durchlauf { printf( "Bitte die Umsaetze der letzten Woche eingeben: \n" );//7x erscheint dieser Satz scanf( "%f", &umsatz );//7x den Benutzer darum bitten, einen Wert mit float typ einzusetzen. //der Wert wird im adresse umsatz gespeichert // BLEIBT UNBEKANNT(ich kenne nur die Form scanf ("%f", &umsatz) } summe = 0; //UNBEKANNT. Muss nicht int oder float vor summe schreiben? hoechsterWert = umsatz[0];///UNBEKANNT. Muss nicht int oder float vor hoechsterWertschreiben? niedrigsterWert = umsatz[0/UNBEKANNT. Muss nicht int oder float vor niedrigsterWert schreiben? for( i = 0; i < 7; ++i ) // 7x durchlauf { summe += umsatz[ i ];//die vom benutzer eingegebene Werte addiert und in variable summe eingesetzt. if( hoechsterWert < umsatz )//UNBEKANNT. Ich kenne schon die if Anweisung, aber ich verstehe nicht, was genau dieses if hier macht hoechsterWert = umsatz;//UNBEKANNT if( niedrigsterWert > umsatz )//UNBEKANNT niedrigsterWert = umsatz;//UNBEKANNT } printf( "Gesamter Wochengewinn: %f \n", summe );//die gesamte Summe wurde hier dargestellt printf( "Hoechster Umsatz: %f \n", hoechsterWert );//hier wurde der Höchste Wert erkannt und im Bildschirm dargestellt. Aber wie? printf( "Niedrigster Umsatz: %f \n", niedrigsterWert );//hier wurde der Niedrigste Wert erkannt und im Bildschirm dargestellt. Aber wie? return 0; } Ich hoffe, so ist es verständlicher mit den Farben. Danke Zitieren
Klotzkopp Geschrieben 5. Januar 2011 Geschrieben 5. Januar 2011 // BLEIBT UNBEKANNT(ich kenne nur die Form scanf ("%f", &umsatz)laubi hat es schon geschrieben: Mit den eckigen Klammern greift man auf einzelne Elemente eines Arrays zu. Das Array umsatz ist ein float[7], also kann man die 7 floats auch einzeln ansprechen, mit umsatz[0] bis umsatz[6]. Und genau das passiert hier: Bei jedem Schleifendurchlauf wird ein Wert in ein anderes Arrayelement eingelesen, denn i läuft von 0 bis 6. summe = 0; //UNBEKANNT. Muss nicht int oder float vor summe schreiben? Nein. Die Variable summe wurde doch schon weiter oben definiert. Man darf jede Variable nur einmal definieren. Dasselbe gilt für die anderen Variablen. if( hoechsterWert < umsatz )//UNBEKANNT. Ich kenne schon die if Anweisung, aber ich verstehe nicht, was genau dieses if hier machtHier wird der höchste Wert im Array gesucht. Die Vorgehensweise ist ähnlich, wie das ein Mensch machen würde: Du siehst dir den ersten Wert an und merkst ihn dir. Dann siehst du dir den nächsten Wert an. Ist er größer, vergisst du den ersten und merkst dir den neuen. Ist er es nicht, gehst du zum nächsten Wert usw. Am Ende ist dann der Wert, den du dir gemerkt hast, der größte. Die Variable hoechsterWert repräsentiert hier das "Merken". Sie speichert den bis dahin größten gefundenen Wert. Dann wird dieser Wert nach und nach mit jedem einzelnen Wert im Array verglichen. Und wenn der Arraywert größer ist, wird der gemerkte Wert durch den Wert aus dem Array ersetzt. Zitieren
carstenj Geschrieben 5. Januar 2011 Geschrieben 5. Januar 2011 Hi, vielleicht solltest du dir, wenn du ernsthaft C lernen möchtest, ein Buch kaufen. Zitieren
Wuwu Geschrieben 5. Januar 2011 Geschrieben 5. Januar 2011 Galileo Computing :: C von A bis Z Zitieren
mercadom Geschrieben 10. Januar 2011 Autor Geschrieben 10. Januar 2011 Hi Klotzkopp, vielen Dankk für die Erklärung. Jetzt habe ich endlich verstanden, wie das geht. Das Abstrakt denken hat mir Schwierigkeiten mitgebracht, aber nach dem Üben, geht es enfacher. Ich habe schon das komplette Programm verstanden, danke. Zitieren
mercadom Geschrieben 10. Januar 2011 Autor Geschrieben 10. Januar 2011 Hallo Carstenj, ich habe schon ein Buch gekauft, aber ich finde besser, die dierekte Fragen auf dieser Website zu stellen. Nur so kann ich weitergehen. Danke Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.