2 Stimmen

Array von Ganzzahlen vs. Zeiger auf Ganzzahl in c++

Wenn ich int x[10] und int *y habe, wie kann ich den Unterschied zwischen den beiden erkennen?

Ich habe zwei Ideen:

  1. sizeof() ist anders.

  2. &x hat einen anderen Typ --- int (*p)[10] = &x funktioniert, aber nicht int **q = &x.

Noch andere Ideen?

In einigen Vorlagenbibliothekscode muss ich bestimmen, ob ein Zeiger ein "echter" Zeiger ist oder von einem Array abgeleitet wurde. Ich kann keinen Quellcode ansehen, da der Bibliotheksnutzer erst existiert, wenn ich die Bibliothek schreibe. ... Ich kann dies umgehen, indem ich den Code neu schreibe, also ist dies jetzt nur eine theoretische Übung.

5voto

Es gibt keine allgemeine Methode - entweder kennen Sie den Typ bereits, weil Sie gerade das Objekt deklariert haben, oder der Typ wird zu einem Zeiger verfallen und verloren gegangen sein. Bitte erklären Sie, welches Problem Sie lösen möchten, indem Sie zwischen ihnen unterscheiden.

2voto

Daniel Earwicker Punkte 111630

Die sizeof-Idee ist nicht sehr gut, denn wenn das Array zufällig ein einzelnes Element hat und der Elementtyp zufällig die gleiche Größe wie ein Zeiger hat, wird es dieselbe Größe wie die Größe eines Zeigers haben.

Der Typ-Abgleichsansatz wirkt vielversprechender und könnte vermutlich verwendet werden, um eine Template-Spezialisierung auszuwählen (wenn das Ihr Ziel ist).

2voto

MSN Punkte 51308

Angenommen, dass Sie dies nicht für einen an Funktionsskopus deklarierten Typ versuchen:

struct yes { char pad; };
struct no { yes pad[2]; };

template <typename T, size_t N> yes is_array_test(T (&arr)[N]);
no is_array_test(...);

#define IS_ARRAY(x) (sizeof(is_array_test(x))==sizeof(yes))

0voto

user88637 Punkte 11240

Int x[10] wird immer auf dem Stapel an dem Ort zugewiesen, an dem es aufgerufen wird. Der Wert von x kann nie geändert werden.

int *y deklariert einfach einen Zeiger auf einen Speicher, dessen Wert jederzeit ohne Einschränkungen geändert werden kann.

int *y kann jeden beliebigen Wert haben. Das bedeutet, dass er auf im Stapel allokierten Speicher oder im Heap allokierten Speicher zeigen kann. Technisch gesehen kann er auch auf ungültigen Speicher zeigen, aber das ergibt keinen Sinn.

int x[10] garantiert, dass Sie immer auf gültigen Speicher zeigen und sich keine Gedanken über die Speicherdeallokation machen müssen.

Wenn Sie int* y verwenden, müssen Sie sich Gedanken über den Speicher machen, auf den er zeigt.

Beachten Sie auch, dass je mehr dynamisch alloziierter Speicher Ihr Programm hat, desto mehr ist es anfällig für Fehler, Lecks, Leistungsprobleme, Allokations-/Deallokationsasymmetrien und viele andere Arten von Problemen.

0voto

Captain Segfault Punkte 1636

Sie sind verschiedene Typen.

Wie unterscheidet man zwischen einem int32 und einem uint32, oder einem uint32 und einem char[4]?

Der richtige Weg, darüber nachzudenken, ist, dass der einzige Weg, wie sie ähnlich sind, ist, dass in bestimmten Kontexten (einschließlich Array-Indexierung!) ein Array in einen Zeiger umgewandelt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X