Fragen über Fragen



  • Hallo,

    1. const char* test; Was ist hier genau const?

    const char* findInCstring(const char* a, char x) {
    
    	while(*a) {
    
    		if(*a == x)
    			return a;
    
    		a++;
    
    	}
    
    	return 0L;
    
    }
    

    Ich kann den Zeiger a hochzählen da er copypervalue reinkommt aber wieso kann ich ihn returnen? Ich denke lokale Vars kann man nicht returnen bzw. diese werden gelöscht?

    Mfg



  • void s(int* a, int* b) {
    
    	int tmp = *a;
    
    	*a = *b;
    
    	*b = tmp;
    
    }
    

    Wieso kann ich einen Zeiger also dessen Kopier ändern???

    Ich blicke nun garnicht mehr durch 😞



  • Hallo

    Zeiger sind selber auch nur Variablen. Die Rückgabe von a bedeutet nichts weiter als das die Adresse, die a als Parameter bekommen hat, als Rückgabe kopiert wird. Wichtig ist nur, das der Speicherbereich, auf den a zeigt, auch außerhalb der Funktion gültig ist.
    Technisch gesehen ist das dasselbe Prinzip wie bei dem hier :

    int func(int a)
    {
      return a * 2;
    }
    

    Das ist vollkommen korrekt, da Zeiger wie int kopierbar sind.

    Was du aber nicht machen darfst ist Referenzen auf lokale Speicherbereiche zurückgeben :

    int* func()
    {
      int a = 4;
      return &a; // Falsch, den Speicherbereich von a gibt es außerhalb nicht mehr!
    }
    

    bis bald
    akari



  • Danke akari!

    Aber warum stimmt mein 2. Code?



  • Hallo

    Zum zweiten Post :
    Schau mal genauer hin. Es werden nicht die Zeiger geändert (diese würden sich ja nur lokal ändern), sondern die Speicherbereiche hinter den Zeigern. Die Zeile *a = *b; sagt aus : Kopiere den Wert auf den Zeiger b zeigt in den Bereich wo a hinzeigt. Die Adressen der Zeiger selber bleiben gleich. Das ist möglich weil die Parameter als Nichtkonstante Übergabe By Reference zu werten ist.

    bis bald
    akari



  • DerGast schrieb:

    Danke akari!

    Aber warum stimmt mein 2. Code?

    Also nur weil die beiden Zeiger außerhalb existieren kann ich copypervalue die Werte der Zeiger ändern? Aber wieso übergebe ich dann nicht einfach direkt die Zeiger per Referenz?



  • DerGast schrieb:

    Also nur weil die beiden Zeiger außerhalb existieren kann ich copypervalue die Werte der Zeiger ändern? Aber wieso übergebe ich dann nicht einfach direkt die Zeiger per Referenz?

    Nope. Du kannst nur das ändern, worauf die Zeiger zeigen. Nicht die Zeiger selbst. Die Zeiger werden doch kopiert.

    Gruß
    Don06



  • Hallo

    Also nur weil die beiden Zeiger außerhalb existieren kann ich copypervalue die Werte der Zeiger ändern?

    Ja

    Aber wieso übergebe ich dann nicht einfach direkt die Zeiger per Referenz?

    Weil doch nicht die Zeiger geändert werden sollen, sondern das worauf die Zeiger zeigen. Wenn du wirklich die Zeiger ändern willst, must du in der Tat sowas schreiben :

    void s(int** a, int** b) {
    
        int* tmp = *a;
    
        *a = *b;
    
        *b = tmp;
    
    }
    

    Nun wird nicht ein Wert kopiert, sondern die beiden Zeiger werden vertauscht. Das heißt a zeigt dann auf den Speicherbereich wo vorher b hingezeigt hat, und umgekehrt.

    bis bald
    akari



  • DerGast schrieb:

    1. const char* test; Was ist hier genau const?

    Das Schlüsselwort const bezieht sich immer auf das, was direkt links davon steht. Nur wenn, wie in deinem Beispiel, das const selbst ganz links steht, bezieht es sich auf das, was rechts davon steht (dementsprechend könnte man auch char const * schreiben, das bedeutet genau das selbe).

    Nun da das geklärt ist: Das const bezieht sich hier auf das char , also auf die Daten, auf die der Zeiger zeigt. Der Zeiger selbst ist nicht konstant.



  • immer die gleichen. Mal besser hinschauen



  • Danke nun hab ichs endlich verstanden 🙂


Anmelden zum Antworten