Adresse eines Elements aus einem Vector einem Pointer zuweisen
-
Hi Leute,
ich will die Adresse eines Elements aus einem Vector (der selbst ein Pointer ist) einem Pointer zuweisen.
In Zeile 18 knallts. Wie muss hier richtig konvertiert werden?
Danke euch.
#include <iostream> #include <vector> typedef struct { int number1; int number2; }number_t; int main() { const std::vector<number_t> number = { {1,2}, {3,4} }; const std::vector<number_t>* numberPtrVector; number_t* numberElement; numberPtrVector = &number; numberElement = &numberPtrVector[0]; std::cout << "Hello World!\n"; }
-
Was soll denn da knallen? Der Compiler sagt dir hoffentlich, was da falsch ist.
So ists richtig:
numberElement = &(*numberPtrVector)[0];
(Kann sein dass du beinumberElement
noch einconst
brauchst.)Warum bzw. ob man solchen Code schreiben sollte steht auf einem anderen Blatt.
-
Das Problem ist,
numberPtrVector
ist ein Pointer und kein Vector, daher greifst du mit[0]
nicht auf das erste Element des Vektors zu, auf den der Pointer zeigt.
-
Boah sieht das ekelig aus Aber macht Sinn, danke euch!
-
@des1re10 sagte in Adresse eines Elements aus einem Vector einem Pointer zuweisen:
numberPtrVector
Mich wundert, dass das überhaupt kompiliert...
-
@It0101 Mein Tipp ist der OP glaubt ein Compilererror ist ein Knallen.
-
Ja ich meinte Kompilerfehler.
Gruß
-
@des1re10 sagte in Adresse eines Elements aus einem Vector einem Pointer zuweisen:
typedef struct
{
int number1;
int number2;
}number_t;Noch was anderes. In C++ kannst du das eingängiger schreiben als:
struct number_t { int number1; int number2; };
Kein komisches typedef nötig. Diese C-Schreibweise mit typedef verwirrt mich jedes Mal wieder
-
Du brauchst doch überhaupt keinen Zeiger auf den
vector
:const std::vector<number_t> number = { {1,2}, {3,4} }; number_t* numberElement = &number[0];
Du solltest aber besser mit Iteratoren arbeiten, anstatt direkt mit Zeigern.
-
Du solltest dir im Klaren darüber sein, dass Zeiger und Iterartoren bei Änderungen am Vector ungültig werden können.
-
@des1re10 Eklig sieht aus, was du da versuchst Wahrscheinlich kann man das eleganter Lösen, aber dafür müssten wir das eigentliche Problem kennen.
-
@manni66 sagte in Adresse eines Elements aus einem Vector einem Pointer zuweisen:
Du solltest dir im Klaren darüber sein, dass Zeiger und Iterartoren bei Änderungen am Vector ungültig werden können.
Ach Kind, das const macht es schwierig den vector zu ändern.
-
Nur der Vollständigkeit halber, hier das ursprüngliche Problem im Original-Code, das einem gute Compiler heutzutage klar und verständlich aufdröseln (ich kann nur Empfehlen solche Meldungen zu lesen und die Zeit zu investieren, sie vollständig zu verstehen):
<source>:18:21: error: assigning to 'number_t *' from incompatible type 'const std::vector<number_t> *' numberElement = &numberPtrVector[0]; ^~~~~~~~~~~~~~~~~~~
Ansonsten assoziiere ich "knallen" auch mit einem Fehler zur Laufzeit.
Auch kann ich nur vermuten, was du hier vorhast. Vergleichbarer Code sähe bei mir allerdings eher so aus:
auto& numberElement = numberPtrVector[0];
Ich vermeide gerne Pointer, wenn es auch eine Referenz tut. Mit denen lässt sich wesentlich angenehmer weiterprogrammieren, wie ich finde.