Zum Inhalt springen

Problem mit Arrays in Programmiersprache C


Empfohlene Beiträge

Geschrieben

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;

}

Geschrieben

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

Geschrieben

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.

Geschrieben
nun, arrays basieren eig komplett auf zeigern (pointern)
Array und Zeiger sind unterschiedliche Dinge. Bitte nicht durcheinanderwerfen.

//a ist der zeiger auf das erste element
Nein, a ist der Name des Arrays. Arrays sind implizit in Zeiger auf den Elementtyp konvertierbar, der dabei entstehende Zeiger zeigt auf das erste Element.
Geschrieben

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.

Geschrieben (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 von carstenj
Geschrieben

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?

Geschrieben
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?

Geschrieben

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.

Geschrieben
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

Geschrieben
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 :)

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben
// 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 macht

Hier 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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...