Wenn du schreibst b=a, sagst du damit, das b die Position von a[0] im Speicher. Du kannst jederzeit b auf eine andere Adresse zeigen lassen.
zB.: b=c wenn c auch ein Array von char ist.
char[3] a; //Array im Stack (3Byte Speicher für a[0]-a[2])
char[3] c; //Array im Stack (dito)
char[] b; //Zeiger auf einen char (4Byte speicher auf 32Bit-System)
//…
b=a; //Jetzt zeigt b auf a
//Alternative: b=&a[0]
b[1]=‚A‘;
// jetzt ist a[1]=‚A‘
b=&c[0]; //einfacher auch b=c;
b[1]=‚B‘;
//jetzt ist auch c[1]=‚B‘, a[1] ist weiterhin ‚A‘
//auch das ist möglich:
b=&a[1];
b[1]=‚C‘;
//jetzt ist a[2]=‚C‘
//man kann also bei b nie genau wissen, wie groß das array ist, auf das es zeigt. char[] b ist gleich char* b und damit ist b nur die adresse eines Beliebigen char wertes. Man kann als „syntaktische Zuckerl“ wie auf ein Array zugreifen. man muss vorher sicher stellen, dass man keinen nicht reservierten speicher zugreift.
b=a;
b=b+2; //Das ist möglich!, da b ein Zeiger ist
//b zeigt jetzt zwei chars weiter als a[0]
//also ist b=&a[2]
b[1]=‚D‘;
//Diese Zeile führt zu nicht vorhersehbaren ergebnissen
b[0] ist a[2] also ist b[1] a[3], was laut definition nicht mehr teil des arrays ist.
Es muss einem klar werden, dass char[] und char[n] (n ist ein Literal zB 3)völlig verschiedene sachen darstellen.
char[] ist char* ist ein Zeiger auf einen char wert.
char[n] sind n char werte im stack. in meinem bsp. ist a eine feste adresse (die differenz zwischen anfang der funktion und a ist immer gleich). Man kann nicht schreiben a=c, das würde bedeuten &a[0]=&c[0];
das ist genauso unmöglich wie:
int a,b;
&a=&b;