Sign in to follow this  
Followers 0

Zeiger auf Zeiger oder nur Zeiger als Parameter einer Funktion

6 posts in this topic

Posted

Hallo,

Wo liegt der Unterschied zwischen

void SwapLong(long *x, long *y)
(
h=*x;
*x=*y;
*y=h;
)

und

void SwapZeiger(long **x, long **y)
(
h=*x;
*x=*y;
*y=h;
)
Bei SwapLong wird mittels des Zeigers die Variable des Objektes getauscht und bei SwapZeiger wird nur der Zeiger auf einen anderen Zeiger getauscht?
verstehe ich das so richtig?

Share this post


Link to post
Share on other sites

Posted

Ja. Wichtig ist zu verstehen, dass in C in einer Funktion immer eine Kopie, also eine neue Variable (oder Konstante), des übergebenen Objekts angelegt wird.

In SwapLong wird eine neue Variable x vom Typ long* angelegt. Diese neue Variable enthält die Adresse der Variablen der aufrufenden Funktion.

Also sage ich irgendwo im Programm

SwapLong(&a, &b);

steht in x die Adresse von a. Also x ist eine Kopie von &a.

Mit *x kann ich somit direkt auf a zugreifen.

Für SwapZeiger sieht das ganze beispielsweise so aus

long* p = &a;
long* q = &b;

SwapZeiger(&p, &q);

In der Funktion SwapZeiger wird dann die neue Variable x vom Typ long** erstellt, ein Zeiger, der auf eine Variable vom Typ long* zeigt, also ein Zeiger auf einen Zeiger auf eine Variable vom Typ long.

Die Funktion, wie du sie beschrieben hast, vertauscht somit p und q. p zeigt danach auf b und q zeigt danach auf a. b und a selbst bleiben unverändert. Um denselben Effekt wie mit SwapLong zu erzielen könnte die Funktion etwa so aussehen:

void SwapLongAlternative(long **x, long **y)
{
    long h;
    h = **x;
    **x = **y;
    **y = h;
}

Für solche Überlegungen ist es auch ganz hilfreich, die Sachen einfach zu programmieren und sich die einzelnen Variablen ausgeben zu lassen. Mit dem Platzhalter %p statt %ld in printf kannst du dir die Adressen anzeigen lassen.

Share this post


Link to post
Share on other sites

Posted

Danke,

Was hast das mit dem Typ long * auf sich? wo liegt der Unterschied zum Typ long?

Ich dachte dass der Deferenzierungsoperator (*) das Objekt auf der das Pointer zeigt aus gibt.

Des weitern hätte ich eine Frage, und zwar, wie man in C Numerisch integrieren kann?

Auch deren verschiednen Methoden (Trapez, Simpson und Newton), da ich gelesen habe dass das auch zur mündlichen kommen kann und ich nicht weiß, wie ich es erklären soll, bzw findet man im internet auch nicht so viel darüber.

Share this post


Link to post
Share on other sites

Posted

auch wenn immer alle C Programmierer schreien werden: der Typ ist long*. Wenn ein Stern am Typ dran ist, handelt es sich um einen Zeiger auf diesen Typ. Das ist als eigener Datentyp zu verstehen.

long a; //Typ long

long* b; // Typ long*

besonders verwirrend ist das weil man in C den gleichen Stern zum dereferenzieren verwendet. Was der Stern macht muss man am Kontext erkennen.

Zur numerischen Integration zerlegt man die Funktion in viele kleine Intervalle und auf den Intervallen nähert man sie durch ein polynom an. Dieses polynom kann man dann analytisch integrieren und das integral über das polynom hängt dann nur noch von funktionswerten an gewissen Punkten im Intervall ab.

Am besten du malst dir mal eine Funktion auf. Dann teils du sie in viele Intervalle und näherst sie in jedem interval durch ein Rechteck an. Das ist die einfachste Art (polynom Grad 0). Dafür kannst du dir dann überlegen wie man die Fläche dieser Rechtecke berechnet. Das ist nun dein numerisches integral. Als nächstes nimmst du keine Rechtecke sondern verbindest beispielsweise die funktionswerte am den intervallenden mit einer Strecke. Dadurch entstehen lauter Trapeze von denen man die Fläche einfach ausrechnen kann (polynomgrad 1). Das Spiel kann man weiterspielen wenn man mehrere Punkte im interval hernimmt und polynome höherer Ordnung verwendet. Die schwierige Frage ist dann welche Punkte aus dem interval man wählt. Das beste was mir bekannt ist hat jeweils "gauss" im Namen (wie so vieles in der Mathematik).

gemeinsam haben diese Integrationsverfahren, dass sie genauer werden umso mehr Intervalle man verwendet (= irgendwie logisch) und in der Regel wird der näherungsfehler mit steigender intervalzahl je schneller kleiner je größer die polynom Ordnung ist und je mehr Punkte man pro Interval verwendet. Aber wenn die Funktion "hinreichend glatt" ist, wird der Fehler sehr schnell beeindruckend klein (besonders mit diesen gaussverfahren).

hoffe ich habe dich jetzt nicht ganz verwirrt ;)

Share this post


Link to post
Share on other sites

Posted

Und wie funktioniert die Newton Methode explizit? Was muss man alles zur mündlichen dazu wissen und erzählen können?

Die Trapez Methode funktioniert, in dem man mittels eines Trapezes sich an die Funktion annähert.

Die Simpson Methode funktioniert mittels der Annäherung einer Parabel.

Die Newton Methode funktioniert..........

post-19542-0-13505200-1429888944_thumb.p

post-19542-0-17156900-1429888955_thumb.p

post-19542-0-77157700-1429888965_thumb.p

post-19542-0-52350300-1429888976_thumb.p

post-19542-0-13391400-1429888987_thumb.p

Share this post


Link to post
Share on other sites

Posted

Hallo,

Ich bin mir gerade etwas unsicher, was man bei der frage wissen bzw sagen sollte?

"Wie muss ein Knoten eines Baumes definiert werden, wenn jeder Knoten eine variable Anzahl von Nachfolgern besitzten kann?"

Wird ein Knoten dann mittels einer rekursiven Struktur realisiert, die sich so oft auf ruft, wie es Anzahl an Knoten gibt?

Also ist der Knoten mittels eines Verbunddatentyps realisiert?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0