ich habe mir in C++ ein struct definiert, das folgendermaßen aussieht:
struct Color{ byte r; byte g; byte b; byte a; };
Dazu noch einen Zeiger auf diese Struktur:
Color *p;
Nun brauche ich diese Struktur aber nicht nur einmal, sondern z.B. 10mal. Das könnte ich mit der Zeile
Color *p[10];
ja relativ einfach lösen. Nun kommt aber endlich das Problem Die Größe des Arrays ist mir noch nicht bekannt, sondern wird erst beim Programmstart festgelegt. Im Internet habe ich mehrere Ansätze gefunden, die das so aussehen lassen:
Color *p;
p = new Color[size];
Das wird zwar auch einwandfrei compiliert, doch wenn ich mir den Debugger anschaue, dann zeigt p nicht auf size (z.B. 10) Strukturen, sondern immer nur noch auf eine. Wie kann ich das ändern?
Das wird zwar auch einwandfrei compiliert, doch wenn ich mir
den Debugger anschaue, dann zeigt p nicht auf size (z.B. 10)
Strukturen, sondern immer nur noch auf eine. Wie kann ich das
ändern?
ein Zeiger kann doch nur auf eine Adresse im Speicher zeigen, daher zeigt es standardmäßig auf das erste Element deines Arrays.
Du kannst ihn aber auch auf das 2., 3. oder x. Element deines Arrays zeigen lassen, indem du dann um sizeof Color weiterspringst.
was Du machen willst, nennt man „dynamische Speicherverwaltung“. Am besten benutzt Du dazu den Datentyp vector aus der STL. Sollte Dir der aber nicht zur Verfügung stehen, so kannst Du den Speicher auch selbst verwalten:
Color *p=0; // Zeiger auf das erste Element
…
p=malloc(size*sizeof(Color)); // Speicher für size viele Elemente reservieren
…
dummy=p[200]; // Elemente ansprechen (Vorsicht: maximal size viele!
…
free§; // Am Ende: Speicher wieder freigeben
Ein Array ist nämlich eigentlich nichts anderes als ein Zeiger auf das erste Element eines Arrays. Die weiteren Elemente werden einfach durch Addition zu dieser Adresse ermittelt. Die Index-Schreibweise i[100] ist nur eine Abkürzung für *(i+100) (oder richtiger *(i+sizeof(Color)*100)).