Forum: Mikrocontroller und Digitale Elektronik C-Nachhilfe Verstehe Teilcode nicht


von ich bin ein (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe hier ein Teilstück von einem Code, der mir nicht verständlich 
ist.
Kann mir den jemand mal bitte erläutern?

Danke Bruno

von marcel (Gast)


Lesenswert?

hallo. es werden const char zeigervariablen deklariert und gleichzeitig 
intialisiert...

von Εrnst B. (ernst)


Lesenswert?

Der Programmierer wollte sich wohl ein wenig Tipparbeit sparen..., 
äquivalent und leichter zu lesen wäre:
1
const char * const str_Klassen[]={ "a", "b" };
2
const char * const str_Objekte[]={ "c", "dd" };
3
usw...

von Bruno (Gast)


Lesenswert?

Komme aber nicht so mit dem *const klar. Ein Zeiger wird doch am 
Variablennamen gekennzeichnet. Oder hat das mit der Kommaunterteilung am 
Zeilenende zu tun?

von Εrnst B. (ernst)


Lesenswert?

Ja, liegt am Komma.

z.B. Bei
1
 int a=1,b=2;
bezieht sich das "int" auf a UND b,
bei obigem Code ist es halt das "const char", das für die nachfolgenden 
Variablen gilt.

Zum besseren Verstehen vielleicht einfach mal den code OHNE alle "const" 
drin vorstellen, vielleicht wirds dann klarer.

von Bruno (Gast)


Lesenswert?

Also habe ich hier eine const char und einen const Zeiger der auf ein 
Array zeigt??

von Bruno (Gast)


Lesenswert?

Wohl eher einen Zeiger der auf ein const Array zeigt.

von marcel (Gast)


Lesenswert?

z.B  str_Klassen[] ist ein array von zeigervariablen vom typ const char!

von Johannes M. (johnny-m)


Lesenswert?

Das zweite const besagt lediglich, dass nicht nur das Ziel des 
Pointers, sondern auch der Pointer selbst konstant ist.
1
const char *variable;
deklariert einen Zeiger auf eine Variable vom Typ const char während
1
const char *const variable;
einen konstanten Zeiger auf eine Variable vom Typ const char 
deklariert.

von Karl H. (kbuchegg)


Lesenswert?

Bruno wrote:
> Komme aber nicht so mit dem *const klar. Ein Zeiger wird doch am
> Variablennamen gekennzeichnet. Oder hat das mit der Kommaunterteilung am
> Zeilenende zu tun?

Yep.

Ist im Grunde das gleiche, wie wenn du schreiben würdest

  int i, j, k;

jetzt kommen ein paar Zeilenumbrüche dazu

  int
       i,
       j,
       k;

Soweit so gut. Jetzt gehst aber weiter: Das was hier deifniert
wird, sind Pointer. In C gehört der Pointer-* in einer Definition
immer zur Variablen und nicht zu Datentyp.

  int * i, j;

definiert 2 Variablen. i ist ein Pointer auf int, j ist ein ganz
normaler int. Wenn j ebenfalls ein Pointer sein soll, dann muss
man das so schreiben

 int * i, * j;

Wieder: Wenn da jetzt ein paar Zeilenumbrüche dazukommen, dann
sieht es so aus

 int
    * i,
    * j;

Damit hast du schon fast die Form aus deinem Posting.

Jetzt sind die Pointer aber nicht einfach nur Pointer, sondern
es sind const Pointer. const wirkt immer auf den Bestandteil links
von ihm, es sei denn es ist bereits das linkste Sprachelement. In
dem Fall gilt es auf das Element rechts von ihm

  const int      ist also ein integer, welcher konstant ist
  int const      ist ebenfalls ein integer, welcher konstant ist

  const int *    ist ein Pointer, welcher auf einen int zeigt und der
                 int ist konstant

  int const *    ebenso: der Pointer zeigt auf einen konstanten int

  int * const    hier ist der Pointer konstant. Er zeigt allerdings
                 auf eine Speicherstelle, an der ein int liegt und
                 dieser int könnte verändert werden

  const int * const   hier ist sowohl der Pointer konstant als auch
                      das worauf er zeigt.

Um also Auszudrücken, dass der Pointer selbst konstant ist, muss
das const rechts vom * stehen.

Und damit hast du alle Zutaten beisammen um zu verstehen, was

const char
   * const  a,
   * const  b,
   * const  c;

bedeutet. Es werden 3 Pointer vereinbart: a, b, und c. Jeder dieser
Pointer ist selbst konstant und zeigt auf ein Zeichen (eine Zeichen-
kette) die ebenfalls konstant ist.

Und da hier alles konstant ist, muss das auch initialisiert werden.
Später Zuweisen geht nicht, weil man ja an etwas das konstant ist,
nichts zuweisen kann.

const char
   * const a = "Hallo",
   * const b = "Welt",
   * const c = "Juhu";

Misch jetzt noch die Array Syntax für a, b, und c rein und ändere
die Form der Initialisierung für Array Initialisierung um und du
bist genau bei deinem Code.

von Bruno (Gast)


Lesenswert?

Schon mal dran gedacht nen Buch zu schreiben??? Das war super. Danke!!!

von Heinz (Gast)


Lesenswert?

Kann mich nur anschließen, klasse erklärt! Bitte ein C Buch schreiben!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.