Wie Adresse von const char in Funktion übergeben?



  • Ich möchte die Adresse eine const char Variablen als Parameter in eine Funktion übergeben und damit weiter verarbeiten.
    Am Beispiel mit int geht das in etwa so:

    int x = 10;
    
    void  Funktion(int *parameter)
    {	
      int *adr = parameter;
    
      //machwas mit adr
    }
    
    Funktion(&x)
    

    Damit habe ich die Adresse und kann damit weitermachen, aber mit const char komme ich nicht klar. Wie macht man das damit? Gibts da Beispiele?



  • Wie kommst du denn darauf, dass es mit const char* anders gehen sollte?



  • die Variable ist ja const, damit man sie nicht Bearbeiten kann.

    kopier einfach den String aus dem const char in einen nicht-const String.



  • Du kannst genauso auch eine Referenz benutzen:

    int i = 10;
    void funktion( int& ref )
    {
      // mach mit ref irgendwas
    }
    
    char x = 'x';
    void funktion( char& ref )
    {
      // mach mit ref irgendwas
    }
    
    const char y = 'y';
    void funktion( const char& ref )
    {
       // mach mit ref irgendwas
    }
    

    EDIT:
    Jedoch kannst du die konstante Variable auf die sich die Referenz bezieht ja sowieso nicht ändern.

    Gruß freeG



  • Athar schrieb:

    Wie kommst du denn darauf, dass es mit const char* anders gehen sollte?

    Das funktioniert zwar, aber es wird ja nur die Adresse vom ersten Zeichen übergeben. Wenn da mehr Zeichen drin stehen, kommt was anderes raus. Das wäre aber gerade wichtig, weil ich in der Funktion die Werte vergleichen möchte, die zu dieser Adresse gehören. Bei anderen Typen gehts ohne Probleme, daher ja die Frage.



  • Dann machst du was falsch. Es geht genauso wie mit anderen Typen.



  • dixidix schrieb:

    Athar schrieb:

    Wie kommst du denn darauf, dass es mit const char* anders gehen sollte?

    Das funktioniert zwar, aber es wird ja nur die Adresse vom ersten Zeichen übergeben. Wenn da mehr Zeichen drin stehen, kommt was anderes raus. Das wäre aber gerade wichtig, weil ich in der Funktion die Werte vergleichen möchte, die zu dieser Adresse gehören. Bei anderen Typen gehts ohne Probleme, daher ja die Frage.

    Der const char* zeigt auf das erste Zeichen. Das ist richtig. Da passt auch nicht mehr rein. Wenn es auf eine Zeichenfolge zeigt, dann stehen die folgenden Zeichen in den darauffolgenden Speicheradressen. Wenn Du den Zeiger dann an eine Funktion übergibst, dann zeigt der Zeiger noch immer auf das erste Zeichen der Zeichenfolge. Die weiteren Zeichen stehen noch immer in den darauffolgenden Speicheradressen.
    Also ein Beispiel:

    void f(const char* q)
    {
      // q zeigt auf das 'H', q+1 zeigt auf das 'a' usw.
    }
    void g()
    {
      const char *p = "Hallo";
      // p zeigt auf das 'H', p+1 zeigt auf das 'a' usw.
      f(p);
    }
    


  • Also muss das in der Funktion Zeichen für Zeichen aufgedröselt werden? Oder kann man das wie ein Arry behandeln und diese Adresse nehmen?



  • dixidix schrieb:

    Also muss das in der Funktion Zeichen für Zeichen aufgedröselt werden? Oder kann man das wie ein Arry behandeln und diese Adresse nehmen?

    Wieso denn das? Ich dachte dir gehts nur um das erste Element? Und falls es das ist: Wenn die Anfangsadressen identisch sind, kannst du davon ausgehen, dass danach auch die selben Zeichen drin stehen. Wär ja lustig, wenn an der selben Stelle im Speicher verschiedene Werte gespeichert sein könnten.
    Falls das nicht dein Gedanke war, könntest du vllt. noch mal genauer erklären was dein Problem und dein Anliegen sind?



  • Was willst Du wirklich? Beschreibe Dein Ziel.

    http://codepad.org/TyGbWmBg

    #include <iostream>
    
    void foo(const char* p)
    {
      std::cout << p << '\n';
    }
    
    int main()
    {
      foo("Hallo!");
    }
    

    kk



  • Das Problem ist halt, wenn ich die Adresse der ursprünglichen Variable direkt ausgebe, sieht die anders aus als in der Funktion in der die Adresse eigentlich vom Parameter kommen müsste.
    Nach diesem Prinzip müsste es eigentlich gehen:

    int x = 10;
    
    void  Funktion(int *parameter)
    {   
      int *adr = parameter;
    
      //machwas mit adr
    }
    
    Funktion(&x)
    

    aber wenn ich es für chars sinngemaß so mache:

    char  x[3] = {'a', 'b', 'c'};;
    
    void  Funktion(char *parameter)
    {   
      char *adr = parameter;
    
      //machwas mit adr
    }
    
    Funktion(&x)
    

    gehts nicht
    Muss mal schauen, vermutlich wird irgendwo an der eigentlichen Adresse was geändert, aber da muss ich mal schauen. Hab das ja nicht selbst gemacht.



  • #include <iostream>
    using namespace std;
    
    void fun(const char* var) {
        cout << var << endl;
    }
    
    int main() {
        char m[4] = {'m', 'e', 'm', '\0'};
        // fun(&m); // das kompiliert hier nicht mal
        fun(m);
    }
    

    Schau dir nochmal das Kapitel über Arrays und Zeiger an.
    Hier ist m[4] ein Array, m ist ein Zeiger auf das erste Element.



  • dixidix schrieb:

    aber wenn ich es für chars sinngemaß so mache:

    char  x[3] = {'a', 'b', 'c'};
    
    void  Funktion(char *parameter)
    {   
      char *adr = parameter;
    
      //machwas mit adr
    }
    
    Funktion(&x)
    

    gehts nicht

    x ist ja auch kein char sondern ein char-Array. &x ist also vom Typ char()[3] und nicht char. Was Du willst, ist wahrscheinlich

    Funktion(&x[0]); // Die Adresse des ersten Elements
    

    Und das kann man wegen des "Array-zu-Zeiger-Zerfalls" auch so abkürzen:

    Funktion(x);
    

    kk


Anmelden zum Antworten