Hallo mal wieder ![]()
Ich habe eine Frage, warum mal so und mal so ein char initialisiert (?) wird:
const char* router_ssid = "RouterSSID";
const char word[] = "Hallo";
Welche Vor- oder Nachteile hat das?
Danke euch ![]()
Hallo mal wieder ![]()
Ich habe eine Frage, warum mal so und mal so ein char initialisiert (?) wird:
const char* router_ssid = "RouterSSID";
const char word[] = "Hallo";
Welche Vor- oder Nachteile hat das?
Danke euch ![]()
In C Deklarationen ist [] und * gleichbedeutend. Mit einem Array a[] kann man a[i] oder auch i[a] schreiben. In C++ kann das anders aussehen.
Ein Array, egal ob const oder nicht, hat eine mit sizeof() abfragbare Größe. Bei const char* bin ich gerade überfragt, was genau dabei konstant ist.
const char word1[] = "Hallo";
const char word2[] = "Hallo";
Belegt 3 mal Speicher.
1mal im Flash und 2 mal im Ram
const char* router_ssid1 = "RouterSSID";
const char* router_ssid2 = "RouterSSID";
Belegt 2 mal Spiecher
Einmal in Flash und einmal für eine anonyme (readonly) Variable
Dort Unterscheiden sich C und C++ kaum.
Seit kurzem führt auch C die Arraygröße im Datentype mit.
(hat es da von C++ gelernt?)
Die Zeiger- und Arrayzugriffsschreibweisen sind äquivalent.
Sowohl in C als auch in C++
char *test {"13578"};
Serial.print(*(test+2));
Serial.print(test[2]);
Serial.print(2[test]);
int test[] {2,5,8,4};
Serial.print(*(test+2));
Serial.print(test[2]);
Serial.print(2[test]);
Das ist Äquivalenz!
char * test = "gdgd"; // variabler Zeiger auf variablen Inhalt
const char * const test = "gdgd"; // constanter Zeiger auf constanten Inhalt
const char * test = "gdgd"; // variabler Zeiger auf constanten Inhalt
char * const test = "gdgd"; // constanter Zeiger auf variablen Inhalt
(aus dem Gedächtnis gefischt, ohne Gewähr)
Das C und C++ Buch lässt grüßen.
Belegt außerdem zwei Zeiger - Variable, deren Wert sich z.B. bei einer Anweisung wie
router_ssid2 = "AndereSSID";
ändert.
Eine solche Anweisung wäre hier
char router_ssid2[] = "RouterSSID";
router_ssid2 = "AndereSSID"; // error: invalid array assignment
nicht zulässig, egal ob const char oder char Array .
Das ist der eigentliche Unterschied zwischen char* var und char var[]
[Nachtrag]
Außerdem gibt's hier einen Unterschied:
const char* cp = "Hallo";
const char ca[] = "Hallo";
void setup() {
Serial.begin(9600);
Serial.println (sizeof (cp)); // Uno: 2 ESP: 4
Serial.println (sizeof (ca)); // 6
}
Aber nur wenn die entsprechende Optimierung beim Compilieren und Linken eingeschaltet ist und der Linker alle Literale aus allen Modulen auf Gleichheit prüft. Ich würde mich darauf nicht verlassen.
Welches? ![]()
K&R ist das einzige C Buch, das ich je komplett gelesen und weitgehend verinnerlicht habe, und dort gibt es noch kein const ![]()
Viele (auch ich) sehen C++ als die Weiterentwicklung von C an, was formal aber falsch ist.
Dass nach der Erfindung von C++ auch die Sprache C noch erweitert wurde, interessiert eher wenige, denke ich.
"Die Arduino Sprache" ist jedenfalls C++.
Eigentlich egal....
Grundlagen sind Grundlagen.
Für geübte Leser ist auch dieses ausreichend/gut geeignet:
https://en.cppreference.com/w/
Ich sehe, dass C++, als es noch C mit Klassen hieß, aus C hervorgegangen ist.
Seit dem gehen sie getrennte Wege.
Bis heute werden Features von der einen zur anderen Sprache transportiert.
In beide Richtungen.
Und doch werden die Differenzen über die Zeit größer.
Danke euch für dir Erklärungen ![]()
Das muss ich mal sacken lassen ![]()