1.Zeiger bzw. Pointer in C
Aufgabenstellung:
Testen und verstehen Sie folgendes C-Programm:CCode:
#include <stdio.h>Lösung:
Modifiziert man das Programm leicht, sodass alle aktuellen Variablen ausgegeben werden
CCode:
#include <stdio.h>int
main()
{
int *p, q;
float *fp, **fpp, val;
char s[] = "Eine Zeichenkette"; // bzw. char *s = "Eine Zeichenkette!";
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
printf("--Programmbeginn--\nDefiniere p als die Adresse von q:");
p = &q; // Zeiger auf Integer
printf("q=%d p=%p (q wurde aber noch nicht initialisisert!)\n", q, p);
q = 1; printf("q=%d p=%p (q wurde jetzt der Wert 1 zugewiesen)\n", q, p);
(*p)++;printf("Zähle den Inhalt von p 1 hoch: q=%d p=%p \n", q, p);
*p+=1;printf("Weise dem Inhalt von p den um 1 erhöten wert vom Inhalt von p zu: q=%d p=%p \n", q, p);
// Zeiger auf Zeiger
fp = &val; printf("Definiere fp als die Adresse von val: val=%f fp=%p \n", val, fp);
fpp = &fp; printf("Definiere fpp als die Adresse von fp: val=%f fp=%p fpp=%p\n", val, fp,fpp);
**fpp = 203.807; printf("Definiere den Inhalt vom Inhalt von fpp als 203.807: val=%f fp=%p fpp=%p\n", val, fp,fpp);
printf("--Ende--");
return 0;
}
so erhält man:
Ausgabe stdout:
--Programmbeginn--
Definiere p als die Adresse von q:q=-1670453088 p=0012FED8 (q wurde aber noch nicht initialisisert!)
q=1 p=0012FED8 (q wurde jetzt der Wert 1 zugewiesen)
Zähle den Inhalt von p 1 hoch: q=2 p=0012FED8
Weise dem Inhalt von p den um 1 erhöten wert vom Inhalt von p zu: q=3 p=0012FED8
Definiere fp als die Adresse von val: val=0.000000 fp=0012FEE0
Definiere fpp als die Adresse von fp: val=0.000000 fp=0012FEE0 fpp=0012FEDC
Definiere den Inhalt vom Inhalt von fpp als 203.807: val=203.807007 fp=0012FEE0 fpp=0012FEDC
--Ende--
2.Aufgabe Pointer als Funktionesparameter
Aufgabenstellung:
Schreiben Sie eine Funktion, die zwei Werte bekommt und sie vertauscht.
Lösung:
Der Code
CCode:
#include <stdio.h>void swap(int* x,int* y)
{
int tmp;
tmp=*y;
*y=*x;
*x=tmp;
}
main()
{
int x=2, y=3;
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
printf("x=%d,y=%d\n",x,y);
swap(&x,&y);
printf("x=%d,y=%d",x,y);
return 0;
}
liefert die Ausgabe:
Ausgabe stdout:
x=2,y=3
x=3,y=2
Hinweis: Aus mir unerklärlichen Gründen funktioniert swap(x,y) mit void swap(int& x, int& y) nicht.
3.Aufgabe Genauigkeit von Fließkommazahlen
Aufgabenstellung:
Was erwartet man als Ergebnis beider Code Beispiele?CCode:
#include<stdio.h>CCode:
#include<stdio.h>Lösung
zu a) man erwartet 0.000000653589793, erhält aber
Ausgabe stdout:
0.00000065358979295
zu b) Man erwartet, dass die Zahlen von 0.1 bis 1 ausgegeben werden. Tatsächlich erhält man aber eine Endlosschleife, weil 1 nie genau erreicht wird. Daher sollte man besser <=1 verwenden. Vielleicht würde es sich hier anbieten eine neue Funktion für die Gleichheit bzw. Ungleichheit von floatwerten zu schreiben.