Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeier Zeiger...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.01.2004, 00:45 Uhr
KaraHead



Ich geh mal dem Motto nach "Wer nicht fragt bleibt dumm"
Und ja ich hab gegoogelt

Naja hier meine Frage:
Wozu braucht man Zeiger Zeiger (oder wie die heißen)??


C++:
#include <iostream.h>
void main()
{
   int a=5;// int a ist 5
   cout<<a<<endl;// Ausgabe: 5
   int *pa=&a;// int Zeiger pa ist Adresse von a
   *pa=6;// Inhalt von pa ist 6
   cout<<a<<endl;// Ausgabe: 6
   a=7;// a ist 7
   cout<<*pa<<endl;// Ausgabe: 7
   int b=8;// int b ist 8
   int *pb=pa;// int Zeiger pb ist pa, pb zeigt jetzt auch auf a
   cout<<*pb<<endl;// Ausgabe: 7
   int **ppa=&pa;// int Zeiger Zeiger ppa=Adresse von pa;
   cout<<**ppa<<endl;// Ausgabe: 7
   ppa=&pb;// Inhalt von ppa ist Adresse von pb;
   cout<<**ppa<<endl;// Ausgabe: 7
   pb=&b;// pb ist Adresse von b
   cout<<**ppa<<endl;// Ausgabe: 8
};

Warum wird da **ppa auf pa gesetzt wenn *pb=&pa auch geht??
Warum macht man nicht auch *ppa=&pa?

Wo ist der Unterschied zwischen **ppa=&pa und *pb=&pa ???

Gruß KaraHead

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.01.2004, 01:08 Uhr
Pablo
Supertux
(Operator)


1. das sage ich jedem, also nicht böse sein. Die main Funktion soll int sein und nicht void!!!!

Ein Zeiger auf ein Zeiger ist dann nützlich, wenn du z.b. ein 2. dimensionales Array mit unbekannten Längen erstellen können.


C++:
#include <stdio.h>
#include <malloc.h>
int main()
{
    int** arr;
    int x,y, i;
    printf("Geben Sie die beiden Diemensionen an: (Format a,b)\n");
    scanf("%d,%d", &x, &y);
    arr = (int**) malloc(sizeof(int*)*x);
    for (i=0; i<x; ++i)
        arr[i] = (int*) malloc(sizeof(int)*y);
    // speicher ist schon da

    // nun alles freigeben
    for(i=0; i<x; ++i)
        free(arr[i]);
    free(arr);
    return 0;
}



Eine zweite Möglichkeit einen Doppelpointer zu bekommen ist, wenn du ein Array bzw. Pointer bekommst und du willst die Adresse ändern.


C++:
#include <stdio.h>

void foo(char* x) {
    // man kann den Inhalt der Daten auf die x zeigt ändern, die Adresse auf die x zeigt
    // kann nicht geändert werden.
    char* tmp = "Das bleibt nur hier";
    printf("Zeigen x und tmp auf die selbe Adresse? 1=ja, 0=nein. Antwort=%d\n", x==tmp);
    x = tmp;
}

int main()
{
    char* hw = "Hello World";
    foo(hw);
    printf("Wo zeigt nun hw? Auf '%s'\n", hw);
    return 0;
}


Wenn du das ausführst, bekommst du

Code:
Zeigen x und tmp auf die selbe Adresse? 1=ja, 0=nein. Antwort=0
Wo zeigt nun hw? Auf 'Hello World'


Wie du siehst, die Zeichenkette, auf die x zeigt (in foo()) kann geändert werden. Aber die Adresse, auf die x zeigt kann nur innerhalb von foo() geändert werden. Wenn foo() verlassen wird, zeigt x wieder auf die alte Adresse, deshalb bekommt man Wo zeigt nun hw? Auf 'Hello World'

Nun, guck dir das mal an:

C++:
#include <stdio.h>

void foo(char** x) {
    // man kann den Inhalt der Daten auf die x zeigt ändern, die Adresse auf die x zeigt
    // kann nicht geändert werden.
    char* tmp = "Das bleibt nur hier";
    printf("Zeigen x und tmp auf die selbe Adresse? 1=ja, 0=nein. Antwort=%d\n", *x==tmp);
    // zeiger auf zeiger. *x leifert den Inhalt des Zigers auf einen Zeiger. Also eine Adresse.
    *x = tmp; // den Inhalt des Zeigers auf Zeiger kann dan geändert werden
}

int main()
{
    char* hw = "Hello World";
    foo(&hw); // Übergabe der Adresse der Variable hw als Variable und nicht die Adresse von "Hello World"
    printf("Wo zeigt nun hw? Auf '%s'\n", hw);
    return 0;
}


Ergebnis

Code:
Zeigen x und tmp auf die selbe Adresse? 1=ja, 0=nein. Antwort=0
Wo zeigt nun hw? Auf 'Das bleibt nur hier'



Ist das klar?

Bearbeitung von Pablo:

Manchmal will man die Adresse eines Zeigers innerhalb einer Funktion ändern, und dann kann man das benutzen.


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 21.01.2004 um 01:14 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.01.2004, 22:02 Uhr
KaraHead



Ok, danke ich hab zwar lang gekämpft um den Code zu verstehen
aber ich glaub ich hab das wichtigste verstanden.

Danke für die ausführliche Antwort.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.01.2004, 22:19 Uhr
Pablo
Supertux
(Operator)


Ja, am Anfang ist es ein bisschen schwer zu verstehen, das hat mir auch Schwierigkeiten vorbereitet. Aber wenn du verstanden hast, was ein Pointer genau kann und ist, wirst du das andere relativ schnell verstehen. Du musst halt damit arbeiten und nach ein Paar Programmen verstehst du das.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: