Zeiger auf Zeiger



  • hat jemand einen Quellcode an dem ich das Verfahren von Zeiger auf Zeiger mir anschauen kann ?

    Muss kein kompletter Code sein... ich will nur mal sehen, wie das genau funktioniert, da ich eine Datumseingabe mit Zeiger auf Zeiger realisieren soll !



  • T foo;  /* T ist irgend ein Typ */
    T* zeiger;
    T** zeiger_auf_zeiger;
    foo = bar;
    zeiger = &foo;
    zeiger_auf_zeiger = &zeiger;
    


  • AH okay....

    jetzt hab ich erstmal so ein Programm geschrieben:

    #include <stdio.h>
    #include <alloc.h>
    #include <conio.h>
    
    int main(int argc, char* argv[])
    {
      int* Zahl1;
      int** Zeiger_auf_Zahl1;
    
      Zahl1 = (int*)malloc(3);
      scanf("%d", Zahl1);
    
      Zeiger_auf_Zahl1 = &Zahl1;
    
      printf("Zahl ausgeben %d", **Zeiger_auf_Zahl1);
      getch();
      return 0;
    

    Jetzt will ich aber dem Zeiger mehrere Werte zuweisen (*UNABHÄNGIG JETZT VON DIESEM PROGRAMM*)... geht das denn ?

    Im Klartext... ein Zeiger soll die einzelne Anzahl der Tage für jeden Monat im Jahr haben und ein anderer Zeiger soll die Monate (0-12) angeben können !



  • Zahl1 = (int*)malloc(3);
    

    Wenn ich mich nicht irre, allokierst du damit 3 Byte. Für ein Int brauchst Du aber 4 Byte (sizeof(int)).

    Wenn du nur 3 allokierst, bekommst du Probleme, wenn die Zahl, die hinter der Adresse steckt, mehr als 3 Byte verbraucht.

    Besser ist:

    Zahl1 = (int*)malloc(sizeof(int));
    

    Damit kann man eigentlich nix falsch machen.



  • @ Bob:
    Du hast Recht.... ich hab diese Version auch schon hier gehabt. Die wichtigste Frage bleibt bei mir aber noch, denn ich will noch wissen, wie man es realisieren kann, dass zum Beispiel eine bestimmte Anzahl von Zahlen darin gespeichert wird.

    static char daytab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
    

    Diese Variable will ich in Zeigern umsetzen..... 🙂



  • Jetzt will ich aber dem Zeiger mehrere Werte zuweisen (*UNABHÄNGIG JETZT VON DIESEM PROGRAMM*)... geht das denn ?

    Indem Du ein Array von Zeigern erzeugst. Das Vorgehen ist wie beim "normalen" allokieren, bloß mit dem Unterschied, dass man keine Datentypen allokiert, sondern Zeiger von diesen.
    In deinem Fall wäre das

    int** Zeiger_auf_Zahl1=(int**)malloc(sizeof(int*)*nAnz); //hier wäre nAnz wohl 12
    

    Wenn Du mit dem ganzen fertig bist, musst du noch die reservierten Speicher freigeben. Dazu zählen sowohl die einzeln allokierten "Monatstage", sowie das Zeiger-Array.



  • Hast du für "nAnz" dir die Monatstage gedacht ?.... ich frag nochmal zur Sicherheit !

    Wenn ja dann muss nAnz ja die gesamten Werte für die Monatstage im normalen Jahr und im Schaltjahr inne haben.

    Dadurch wäre das Ding doch wieder durch die ganzen Werte eher als Array gedacht oder ?



  • Ja, nAnz steht für die Monate (i.d.R. 12). Damit hast Du 12 int-Pointer allokiert. Diese beinhalten die Adresse für erneute int-Arrays. Diese haben, abhängig vom Monat, unterschiedliche größen.

    In deinem Beispiel oben hast Du das ja schon mal so gemacht - halt nur mit einem Monat. Was Du machen musst ist, jetzt jeden weiteren Zeiger-Zeiger ein anderes int-Array zuzuweisen.



  • Geht das nur so mit den Array.... ich bin nur verwirrt, weil mein Chef gemeint hat, dass er die Aufgabe nur mit Zeiger auf Zeiger gemacht haben will.

    Vielleicht ist daher der Ansatz mit den Arrays nicht entsprechend seinen Vorstellungen 😕



  • Hier mal ein kleines Beispiel.
    Die Monate haben jetzt allerdings nur 30 Tage und ich habe auch keine NULL- Abfrage. Aber so in etwa könnte das ganze realisiert werden

    int main(int argc, char* argv[]) 
    {   
      int** monat;
      int *tage;
    
      monat=(int**)malloc(sizeof(int*)*12);
      for(int i=0;i<12;i++)
      {
    	monat[i]= (int*)malloc(sizeof(int)*30);
      }
    	//damit waere der 4. Tag im 2. Monat
    	//monat[1][3]=wert;
    
      //bzw.  wenn man auf die Array-Adresse einen extra-Pointer legen will:
    	//	tage = *(monat+1);  -> zweiter monat
    	//	tage[3] = Wert;		-> 4.Tag
    
      for(i=0;i<12;i++)
      {
    	free(monat[i]);
    	monat[i]=NULL;
      }
    
      free(monat);
    
      getch(); 
      return 0; 
    }
    


  • Ich arbeite derzeit an einer anderen Variante und muss noch schauen, was ich da genau ausgeben will.

    #include <stdio.h>
    #include <alloc.h>
    #include <conio.h>
    #include <mem.h>
    
    int main(int argc, char* argv[])
    {
      int Monat,
          Jahr,
          Tag,
          index;
      int* nMonat;
      int nAnz = 12;
      int** Zeiger_auf_Zahl1 =(int**)malloc(sizeof(int*)*nAnz);
    
      /* / Nullung des Speicherbereichs /
      memset(nAnz, 0, (sizeof(nAnz)));
      memset(Zeiger_auf_Zahl1, 0, (sizeof(Zeiger_auf_Zahl1))); */
    
      Zeiger_auf_Zahl1[0] = 0;
      Zeiger_auf_Zahl1[1] = 31;
      Zeiger_auf_Zahl1[2] = 29;
      Zeiger_auf_Zahl1[3] = 31;
      Zeiger_auf_Zahl1[4] = 30;
      Zeiger_auf_Zahl1[5] = 31;
      Zeiger_auf_Zahl1[6] = 30;
      Zeiger_auf_Zahl1[7] = 31;
      Zeiger_auf_Zahl1[8] = 31;
      Zeiger_auf_Zahl1[9] = 30;
      Zeiger_auf_Zahl1[10] = 31;
      Zeiger_auf_Zahl1[11] = 30;
      Zeiger_auf_Zahl1[12] = 31;
    
      printf("Bitte geben sie das Jahr ein: \n");
      scanf("%d", &Jahr);
      printf("Bitte geben sie den Monat ein: \n");
      scanf("%d", &Monat);
      printf("Bitte geben sie den Tag ein: \n");
      scanf("%d", &Tag);
    
      *Zeiger_auf_Zahl1 = (int*)malloc(sizeof(int));
        printf("Zahl ausgeben %d", Zeiger_auf_Zahl1[Monat]);
    
      getch();
      return 0;
    

    Was ist daran auszusetzen bis auf die Ausgabe ? Die stimmt meines Erachtens auch noch nicht !



  • Was ich da sehe, ist schon im Ansatz falsch. Ich möchte da nur darauf hinweisen, dass du in einem Array von 12 Feldern, 13 Werte hineinschreiben willst, für die nocht nicht mal Speicher reserviert wurde!
    Außerdem nützt es nichts, die Felder des Pointer-Arrays einfach mit Integer-Zahlen zu füllen.
    Ich würde vorschlagen, du probierst mal das, was ich Dir geschrieben habe oder probierst Deine Variante, nachdem Du dich über Felder bzw. Pointer informiert hast. OK?



  • okay dann mach ich es mal so 😉

    Ich habe jetzt dein Prinzip mal verstanden, wie du an das Programm herangegangen bist !
    Aber wenn ich noch Jahre hinzufüge, dann hab ich ja eine unbestimmte Mange an Jahren, die in Frage kommt und die in den Berechnungsprozess einfließen. Wie wird dann der Allokierungsbefehl für die Jahre sein ?

    Ich hab die Eingabe erstmal so gemacht:

    printf("Bitte geben sie den Monat ein: \n");
      scanf("%d", &monat);
      printf("Bitte geben sie den Tag ein: \n");
      scanf("%d", &tage);
    

    Nun müsste ich ja entsprechend deines vorherigen Codes auch ganz einfach den Monat und die Tage mit Variablen anwählen können:

    Anzahlmonate = monat;
      Anzahltage = tage;
      monat[Anzahlmonate][Anzahltage];
    

    Bihser geht das auch, aber danach wirds etwas schwieriger !



  • Aber wenn ich noch Jahre hinzufüge, dann hab ich ja eine unbestimmte Mange an Jahren, die in Frage kommt und die in den Berechnungsprozess einfließen

    Die Erweiterung auf Jahre stellt kein großes Problem dar:
    Du kannst dafür dein Zeiger-Array in ein neues Array packen. Sozusagen auf ein ***jahr;

    die Allokierung wäre dann

    int ***jahr=(int***)malloc(sizeof(int**)*nAnzJahre);
    

    Die Adressen da drin sind die Adressen von den Zeiger-Arrays



  • Bisher hab ich die "Zeiger-auf-Zeiger-Sache" hier noch nicht im Programm integriert:

    int ***jahr;
      int **monat;
      int *tage;
      int i, Wert, wert, Anzahlmonate, Anzahltage, monate, index;
    
      monat=(int**)malloc(sizeof(int*)*12);
    
      for(i=0; i<12; i++)
      {
        monat[i]= (int*)malloc(sizeof(int)*30);
      }
      tage = (int*)malloc(sizeof(int));
      printf("Bitte geben sie das Jahr ein: \n");
      scanf("%d", &jahr);
      printf("Bitte geben sie den Monat ein: \n");
      scanf("%d", &monat);
      printf("Bitte geben sie den Tag ein: \n");
      scanf("%d", &tage);
        // damit waere der 4. Tag im 2. Monat
      Anzahlmonate = monat;
      Anzahltage = tage;
      for (index = 0; index <= Anzahlmonate; index++);
      {
        printf("MONATE %d\n", Anzahlmonate);
        printf("TAGE %d\n", Anzahltage);
      }
    getch();
      for (i = 0; i > 12; i++)
      {
        free(monat[i]);
      }
      return 0;
    


  • Was hast Du eigentlich genau vor?



  • Es soll der Tag im Jahr bestimmt werden... also ich geb Datum an und er sagt mir dann zum Beispiel, dass es der 90. Tag im Jahr ist.



  • Soll das etwa heisen, dass du hinter jeden Integer-Wert den Tag des Jahres legen willst?

    Da würde ich mir aber lieber eine sinnvolle Berechnung einfallen lassen...



  • Ne man berechnet erstmal, ob es ein normales Jahr oder ein Schaltjahr ist und dnan rechnet man wenn man die Anzahl der Monate eingegeben hat, die Tage im Jahr zusammen.

    Die zusammengerechneten Tage im Jahr ergeben dann den Wert für den Jahrestag !



  • Und für was benötigst du dann 'Zeiger-Zeiger'?

    Ich verstehe den Zusammenhang mit der Aufgabenstellung nicht!


Anmelden zum Antworten