eine Frage zu Pointern
-
Hallo zusammen,
ich bin absoluter Anfänger in C. Hab aber schon in VB und einiger Scriptsprachen kleinere Programme geschrieben.
Ich habe eine Übungsaufgabe vor mir und bin nicht ganz sicher, wie ich sie richtig lösen kann.
a)Erstellen Sie einen Vektor zahl vom Datentyp double, der 7 Elemente
aufnehmen kann.b) Tragen Sie folgende Werte in die Vektorelemente ein:
3, 7, 11, 15, 19, 23, 27.c) Geben Sie alle Vektorelemente mit zwei Kommastellen jeweils in einer eigenen
Zeile am Bildschirm aus.d) Der Benutzer soll nun über die Tastatur für das 1. 3. 5. und 7. Velktorelement
neue Werte eingeben können.e) Definieren Sie einen Pointer ptr zahl, der auf das erste Element von zahl zeigt
Hier meine Lösung:
double v[7]; int i; for (i=0;i<7;i++) { v[i] = i * 4 +3; printf ("%.2lf\n", v[i]); } for (i=1;i<7;i=i+2) { printf("Bitte %d. Zahl eingeben:", i); scanf("%lf", &v[i]); }
Bei der Aufgabe e bin ich mir nicht ganz sicher. Ist diese Lösung richtig?
int *ptr = v;
Vielen Dank schon mal.
dj
-
Sieht doch gut aus!
Du kannst den vektor natürlich an Ort und Stelle initialisieren:
double v[7] = { 3, 7, 11, 15, 19, 23, 27 };
Und es gibt nur wenig Gründe i ausserhalb der for-Schleife zu definieren:
for (int i=0;i<7;i++) { //... }
Mein Lieblingstipp ist Funktionen vorzuschlagen. Du könntest z.B. die Ausgabe in eine Funktion auslagern.
Das ist besonders spannend, wenn Du hernachv
undptr
über ein und dieselbe Funktion ausgeben willst...Here be dragons!Könntest Du so eine Funktion schreiben?
-
double v[7]; // Wie soll der Vektor heissen? int i; for (i=0;i<7;i++) { v[i] = i * 4 +3; // ok. Ein = {3, 7, 11, 15, 19, 23, 27}; bei der Definition hätte es auch getan printf ("%.2lf\n", v[i]); // f reicht als Formatspecifier. Das l (el) wird geduldet. } for (i=1;i<7;i=i+2) // Das erste Element hat den Index 0; So kommst du nicht bis 7 { printf("Bitte %d. Zahl eingeben:", i); scanf("%lf", &v[i]); // hier ist das lf richtig }
int *ptr = v; // Nein, denn der Zeigertyp muss zum Variablentyp passen.
Der Compiler muss beim dereferenzieren wissen, wie er die Daten interpretieren soll.
Du brauchst also einen Zeiger auf double.
-
Furble Wurble schrieb:
Sieht doch gut aus!
Du kannst den vektor natürlich an Ort und Stelle initialisieren:
double v[7] = { 3, 7, 11, 15, 19, 23, 27 };
Und es gibt nur wenig Gründe i ausserhalb der for-Schleife zu definieren:
for (int i=0;i<7;i++) { //... }
Mein Lieblingstipp ist Funktionen vorzuschlagen. Du könntest z.B. die Ausgabe in eine Funktion auslagern.
Das ist besonders spannend, wenn Du hernachv
undptr
über ein und dieselbe Funktion ausgeben willst...Here be dragons!Könntest Du so eine Funktion schreiben?
Generell stimme ich dir zu. Das ganze ist aber eine Übungsaufgabe für eine Klausur und dort wäre es ein absoluter overhead immer eine Funktion daraus zu machen.
DirkB schrieb:
Der Compiler muss beim dereferenzieren wissen, wie er die Daten interpretieren soll.
Du brauchst also einen Zeiger auf double.Dann eher so?
double *ptr = v;
Vielen Dank an euch.
-
Da hat DirkB wohl genauer hingeschaut.
djerazor schrieb:
Generell stimme ich dir zu. Das ganze ist aber eine Übungsaufgabe für eine Klausur und dort wäre es ein absoluter overhead immer eine Funktion daraus zu machen.
Stimmt auffällig. Wäre halt nur zur Übung - noch ist's ja keine Klausur.
-
double *ptr = v; // Genau
Bei
int *ptr = v;
muss dein Compiler eine Warnung geben.
Wenn nicht, dann musst du ihn so einstellen, dass er die Warnung gibt.
Und dann behandele die Warnungen wie Fehler und behebe deren UrsacheDas ergibt keinen Fehler, weil es aus historischen Gründen möglich ist. Trotzdem ist es so verkehrt.