C++: Array von Zeigern, Zeiger auf Array

Moin,

nochmal das Thema Array von Zeigern vs. Zeiger auf Array.

Car * Marke[20]; sind 20 Zeiger auf je ein Objekt Car, richtig?
Car (*Marke) [20]; ist ein Zeiger auf ein 20-Element-Array vom Typ Car, richtig?

Der Zeiger auf das 20-Element-Array braucht doch wesentlich weniger Stack-Speicher, als die 20 Zeiger und mit *Marke + x (für 0

Hallo Moe,

es geht ja nicht um die Zeiger, sondern um das, worauf sie zeigen: sind die cars in einem array angeordnet, kann man einen Zeiger auf das array verwenden, sind die 20 cars aber irgendwo verteilt, z.B. in 20 verschiedenen Objekten, dann muss man wohl oder übel 20 Zeiger verwenden - die kann man als array anordnen oder auch nicht, je nachdem, was man damit machen will.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin,

nochmal das Thema Array von Zeigern vs. Zeiger auf Array.

Car * Marke[20]; sind 20 Zeiger auf je ein Objekt Car,
richtig?
Car (*Marke) [20]; ist ein Zeiger auf ein 20-Element-Array
vom Typ Car, richtig?

Der Zeiger auf das 20-Element-Array braucht doch wesentlich
weniger Stack-Speicher, als die 20 Zeiger und mit *Marke + x
(für 0

nochmal das Thema Array von Zeigern vs. Zeiger auf Array.

Car * Marke[20]; sind 20 Zeiger auf je ein Objekt Car,
richtig?
Car (*Marke) [20]; ist ein Zeiger auf ein 20-Element-Array
vom Typ Car, richtig?

Tipp:

std::vector Marke; // Vektor von Zeigern

oder direkt:
std::vector Marke; // Vektor von Objekten

Keine Probleme mehr.

Ich glaub Dir ja, dass Du Ahnung hast, aber didaktisch sieht’s eher trübe aus :wink: Bislang hatte ich kein Problem, nur eine Frage. Jetzt hab ich ein Problem:
Was versuchst Du mir zu sagen und welches Problem soll das lösen??

thx
moe.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo moe,

Das heißt, wenn meine Objekte in einem Array liegen, gibt es
keinen Grund, mehr als einen Zeiger zu verwenden, wenn die
Objekte aber „einzeln“ sind, komme ich um einen Zeiger pro
Objekt nicht drumrum, richtig?

Im ersten Fall reserviert der Compiler schon einen Speicherblock in welchem Platz für z.B. 20 Cars Objekte ist. Da die Grösse eines Car-Objekts bekannt ist, kann man die Lage der einzelnen Objekte innerhalb des Speicherblocks problemlos berechnen.

Legst du aber z.B. die einzeln Car-Objekte und erst erst zur Laufzeit auf dem Heap an, also z.B. mit malloc() sind diese Speicherblöcke wild verteilt und du musst zu jedem Objekt einen eigenen Zeiger verwalten.

Ein weiterer Grund könnte auch sein, dass du eine Liste von Car-Objekten hast welche z.B. eine Medell-Liste darstellen und du möchtest daraus eine Bestell-Liste bilden. Mann könnte jetzt auch nur die Indexe der Einträge abspeichern, was aber weniger Effizient ist, wenn viele Zugriffe auf das selbe Objekt gemacht werden müssen.

Car \*Marke[20]
......
 x = Marke[3].x;
 y = Marke[3].y;
 z = Marke[3].z;
.......
 Car \*ptr = Marke[3];
 x = ptr-\>x;
 y = ptr-\>y;
 z = ptr-\>z;

aus „Marke[3].x“ erzeugt der Compiler
&Marke + (3 * sizeof(Car)) + Offset(x);

Aus „ptr->x“ wird aber nur noch:
ptr + Offset(x);

Ohne Optimierung spart man also in obigem Baispiel 2 Multiplikationen ein, wodurch der Code schneller und kleiner wird.

MfG Peter(TOO)

Ich glaub Dir ja, dass Du Ahnung hast, aber didaktisch sieht’s
eher trübe aus :wink: Bislang hatte ich kein Problem, nur eine
Frage. Jetzt hab ich ein Problem:
Was versuchst Du mir zu sagen und welches Problem soll das
lösen??

Das Problem ist, dass du anscheinend an einem Punkt bist, an dem du dir keine Gedanken über Speicherbelegung auf dem Stack oder sonstwo machen solltest, sondern an dem das vorrangige Ziel ist, funktionierenden Code zu schreiben. Dafür gibt es eine Menge Werkzeuge in der Standardbibliothek.

Dein Versuch, Stack zu sparen ist zwar lobenswert, kommt aber (viel) zu früh. Du tauchst damit wieder in die verrückte Welt der Speicherverwaltung „zu Fuß“ ab, was ja nicht unbedingt einfach ist. „Car (*Marke) [20]“ bräuchte ja irgendwo immernoch den entsprechenden Speicher, den du wieder allokieren müsstest. Da tut es auch ein einfaches „Car* Marke“, Arraygrenzen werden sowieso nicht überprüft.

Die zwei Regeln der Optimierung:
(1) Tu’s nicht.
(2) (nur für Experten) Tu’s noch nicht.

Und:
„If you’re posting in ‚For Beginners‘ and your code contains ‚char*‘, then you have a bug!

Der Editor hier mag owt nicht: „Bitte gib Text ein“.

Hallo FlamingMoe

Car * Marke[20]; sind 20 Zeiger auf je ein Objekt Car, richtig?
Car (*Marke) [20]; ist ein Zeiger auf ein 20-Element-Array
vom Typ Car, richtig?

und

Der Zeiger auf das 20-Element-Array braucht doch wesentlich
weniger Stack-Speicher, als die 20 Zeiger und mit *Marke + x
(für 0#include

int iarray [16] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
};

void main()
{
char trz[] = { ‚\n‘, ‚\t‘ }; /* Zeilenwechsel in der Ausgabe? */

int zeile, spalte;
int (\ *slice ) [4] = (int (*) [4]) iarray ;

for( zeile=0; zeileslice[zeile][spalte], trz[spalteAlles klar? :wink:

Grüße

CMБ

Danke. . . owT