bleicher: C- verständniss der Grundlagen

Grüße,
ich versuche zwischendurch imme rwieder mal was über C- zu lesen.

Dabei stieß ich auf folgendes Problem -

Variable und &Variable?

mit "&" adressiert man den speicher der variable? was soll der unterschied sein?

was wäre der unterschied zwischen

char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)

printf("%s", String);

und

printf("%s", &String);

?

in tutorials wird zwar erklärt dass es zeiger sind, aber was heißt es "effektiv"?

das ist leider das prblem mit den kurzen internettutorials - da wird zwar erklärt was man machen muss um effekt "E" zu erzielen, aber Details....

MFG
bleicher

  1. Hallo,

    Dabei stieß ich auf folgendes Problem -

    Variable und &Variable?

    mit "&" adressiert man den speicher der variable? was soll der unterschied sein?

    Der Ausdruck »variable« gibt Dir den Wert der Variable, der Ausdruck »&variable« die Speicheradresse der Variable.

    Beispiel:

    #include <stdio.h>  
    #include <sys/types.h>  
      
    int main (int argc, char **argv) {  
      int var = 3;  
      printf ("%d\n", var);  
      // Auf 64bit-Systemen %016x verwenden  
      printf ("%08x\n", &var);  
      return 0;  
    }
    

    Ergibt bei mir:

    3
    bfec32a0

    Der Wert der Variable ist also 3 und der wird an Adresse 0xbfec32a0 gespeichert (das wird bei Dir mit Sicherheit variieren).

    was wäre der unterschied zwischen

    char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)

    char *String[]="bla bla bla" ist *GANZ FALSCH*.

    Entweder:

    char *string = "bla bla bla";

    oder

    char string[] = "bla bla bla";

    oder wenn Du ein Array von Strings haben willst, dann:

    char *string[] = {
      "bla bla bla",
      "blub blub blub",
      ...
    };

    in tutorials wird zwar erklärt dass es zeiger sind, aber was heißt es "effektiv"?

    Ich kann Dir, was Zeigerarithmetik angeht, wirklich nur empfehlen, Dir mal Kernighan/Ritchie, "Programmieren in C", 2. oder 3. Auflage durchzulesen. Zeiger sind nichts, was man in einem Forenposting mal eben kurz erklärt. Da steckt eine Menge Informationen dahinter und Deine Fragen zeigen, dass Du erst noch *ganz* am Anfang stehst.

    Viele Grüße,
    Christian

  2. was wäre der unterschied zwischen

    char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)

    printf("%s", String);

    und

    printf("%s", &String);

    Der Typ 'char' bezeichnet genau ein Zeichen (normalerweise
    ein Byte). Ein String wird in C als ein Array von 'char'-Zeichen
    gehandhabt, wobei das Ende des Arrays durch eine Null gekennzeichnet wird.

    Beispiel: char *text = "Hallo Welt!";

    In diesem Fall ist text eine Pointer-Variable. Die
    Deklarationssyntax kann man in etwa so lesen:

    "Wenn ich auf die Variable text den Dereferenzierungsoperator '*'
    loslasse, so ist das Ergebnis vom Typ char".

    Die Schreibweise char *text[] = ... macht für eine einzelne
    Zeichenkette keinen Sinn: Hier wird ein Array von Pointern auf
    Zeichenketten angelegt.

    Guck Dir mal folgendes Beispiel an, dann
    wird evtl. einiges klarer:

      
    #include<stdio.h>  
      
    int main(void) {  
      char *text = "Hallo Welt!";  
      char *tmp;  
      
      printf("Startadresse des Strings = %p\n", text);  
      
      for(tmp=text; *tmp; ++tmp)  
        printf("Addresse: %p - Zeichen: %c (0x%2x)\n", tmp, *tmp, *tmp);  
      
      return 0;  
    }  
    
    

    MfG

    Andreas

    1. Hello,

      Der Typ 'char' bezeichnet genau ein Zeichen (normalerweise
      ein Byte). Ein String wird in C als ein Array von 'char'-Zeichen
      gehandhabt, wobei das Ende des Arrays durch eine Null gekennzeichnet wird.

      Genaugenommen ist es nicht das Ende des Arrays, sondern das Ende des Strings, das durch eine \0 gekennzeichnet wird.

      Das ist wichtig, wenn man nur ein Array bestimmter Größe für den String zur Verfügung hat.

      char zeichenkettenname[101];

      kann maximal 100 Zeichen aufnehmen, wenn es noch als "String" behandelt werden soll.
      Da liegt wohl einer der Fehler, dass C das Maximum der Zeichen nicht ausreichend überprüft, so die abschließende \0 schnell mal überschreiben werden kann und eine spätere Ausgabe dann einfach weiter liest im Speicher bis zur nächsten \0.

      Man kann "Strings" zur Sicherheit immer mit \0 initialisieren, bevor man sie neu beschreibt. Das hindert einen natürlich immer noch nicht daran, den zur Verfügung stehenden Platz zu überreizen ...

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  3. Hallo,

    warum wird mal nach char* mal vor variablenname geschrieben?)

    </archiv/2008/10/t177894/#m1172691>

    Freundliche Grüße

    Vinzenz

  4. Hei,

    habe mich auch mal an C rangetraut und mir sogar ein Buch gekauft...
    ich blicke da auch nicht so wirklich durch und verstehe so manche sache nicht..

    Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D

    1. Hi dev/null!

      habe mich auch mal an C rangetraut und mir sogar ein Buch gekauft...
      ich blicke da auch nicht so wirklich durch und verstehe so manche sache nicht..

      Ich auch. 1000 Seiten. Hat mir bei der Wache während meines Bundeswehrdienstes die Nacht versüßt.

      Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D

      Du bist doch nicht etwa ein C-Hasser?!

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D
        Du bist doch nicht etwa ein C-Hasser?!

        Juhu, Programmiersprachen-Flames!
        Scheiße: C, C++, Java, PHP, Basic
        Lol: Perl
        Super: Python, Ruby, JavaScript, Smalltalk
        Göttlich: Lisp

        Achso: HTML-Programmierer dürfen nicht mitmachen!

        --
        Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
        Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
        1. Sup!

          Göttlich: Lisp

          Oh Scheisse, ein "Knight of the Lambda Calculus"! Rette sich, wer kann...

          Gruesse,

          Bio

          1. Oh Scheisse, ein "Knight of the Lambda Calculus"! Rette sich, wer kann...

            Spüre den Klammer-Hammer!

            ((((((((((rumms))))))))))
            ((((((((((rumms))))))))))
            ((((((((((rumms))))))))))
            ((((((((((rumms))))))))))
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)
                     (rumms)

            --
            Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
            Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
            1. Hi!

              Oh Scheisse, ein "Knight of the Lambda Calculus"! Rette sich, wer kann...
              Spüre den Klammer-Hammer!

              ((((((((((rumms))))))))))
              ((((((((((rumms))))))))))
              ((((((((((rumms))))))))))
              ((((((((((rumms))))))))))
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)
                       (rumms)

              Manchmal macht Ihr mir Angst ...

              --
              "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                    - T. Prachett
            2. Sup!

              Ich versteck' mich dann mal auf der anderen Seite des Möbius-Bandes, und wenn Du mich aufspürst, stelle ich Dir das Halte-Problem...

              Gruesse,

              Bio

              1. Ich versteck' mich dann mal auf der anderen Seite des Möbius-Bandes, und wenn Du mich aufspürst, stelle ich Dir das Halte-Problem...

                Während ich das Ende des Bandes suche, zähle ich einfach, ich habe gehört, die Lösung für das Halte-Problem befindet sich am oberen Ende der natürlichen Zahlen. Halt nein, es versteckt sich zwischen der null und der nächstgrößeren reellen Zahl, so war's!

                --
                Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
                1. Sup!

                  Während ich das Ende des Bandes suche, zähle ich einfach, ich habe gehört, die Lösung für das Halte-Problem befindet sich am oberen Ende der natürlichen Zahlen. Halt nein, es versteckt sich zwischen der null und der nächstgrößeren reellen Zahl, so war's!

                  Dir kann man auch nichts vormachen... einigen wir uns auf Unentschieden!

                  Gruesse,

                  Bio

                  --
                  Never give up, never surrender!!!
    2. Hellihello

      Jetzt liegt das Buch in der Ecke... und ich werde es wahrscheinlich auch nicht mehr anrühren :D

      Genauso wahrscheinlich wie Du einen Grammatikduden nicht mehr anrühren würdest. Referenzierung ist ja ein zentraler Baustein bzw. vielleicht aucht DER zentrale Baustein bezüglich Variablen/Strukturen/Objekten in der Programmierung.

      Dank und Gruß,

      frankx

      --
      tryin to multitain  - Globus = Planet != Welt
  5. Moin,

    das ist leider das prblem mit den kurzen internettutorials - da wird zwar erklärt was man machen muss um effekt "E" zu erzielen, aber Details....

    Komplettes, deutsches Buch zu C: http://openbook.galileocomputing.de/c_von_a_bis_z/

    Gruß

    Stareagle

  6. Sup!

    Variable und &Variable?

    Variable und Speicher-Adresse der Variable.

    mit "&" adressiert man den speicher der variable? was soll der unterschied sein?

    int a = 4;

    printf("%d", a);

    4

    printf("%p", &a);

    0x80001312 (oder so...)

    char *String[]="bla bla bla"; (was macht das "*" ? warum wird mal nach char* mal vor variablenname geschrieben?)

    char * String[] = "bla bla bla";

    heisst:

    String[]

    String ist ein Array

    * String[]

    String ist ein Array von Zeiger(n)

    char * String[]

    String ist ein Array von Zeiger(n) auf char

    char * String[] = "bla bla bla";

    String ist ein Array von Zeiger(n) auf char, dessen erstem Element die Adresse der Zeichenkettenkonstante "bla bla bla" zugewiesen wird.

    Eigentlich scheint das zuviel des Guten zu sein.

    char String[] = "bla bla bla";

    (String ist ein Array von char, dem "bla bla bla" zugewiesen wird) sollte reichen.

    printf("%s", String);

    und

    printf("%s", &String);

    Bei einem Array repräsentiert der Variablenname die Basis-Adresse des Arrays, die natürlich mit der Adresse des ersten Elements übereinstimmt.

    Wenn

    char String[3];

    dann gilt:

    String == &String[0]
    String[2] == *(String + 2 * sizeof[char]);

    Hier ist zu beachten, dass es den "*"-Operator zweimal gibt.
    Einmal als Multiplikations-Operator (mit zwei Operanden), einmal als Dereferenzierungs-Operator (mit einem Operanden, der rechts vom Operator stehen muss).

    int a = 2;
    int * b;

    b = &a;
    ==>
    *b == a == 2

    Aber zurück zu Deinem Beispiel:

    printf("%s", String);

    und

    printf("%s", &String);

    Die Verwendung des Adress-Operators ist hier unnötig, denn String ist bereits die Adresse der Zeichenkette.

    Freundlicherweise liefert C als "Adresse einer Adresse" die Adresse zurück, d.h., der Adress-Operator tut quasi gar nichts.

    Wie auch immer, Du solltest ein gutes C-Buch lesen ;-)

    Gruesse,

    Bio

  7. Hallo bleicher,

    Dabei stieß ich auf folgendes Problem -

    Variable und &Variable?

    mit "&" adressiert man den speicher der variable? was soll der unterschied sein?

    hast du schon mal versucht, in einem Adressbuch zu übernachten?

    Gruß, Jürgen