Zeiger auf Element in mehrdimensionalen Arrays



  • Hallo,

    in einem Programm habe ich ein mehrdimensionales Array vom Typ char, das 3x3 char-Speicherplätze enthält.
    In jedem Array wird dann eine hexadezimale Zahl zwischen "00" und "FF" gespeichert.

    Sieht dann in etwa so aus:

    char c[3][3]
    c[0][0]='A';
    c[0][1]='B';
    c[0][2]='\0';
    c[1][0]='C';
    //...
    c[2][2]='\0';
    

    Als Nächstes soll die als char-Array gespeicherte Zahl in einen entsprechenden char-Wert umgewandelt werden (z.B. FF wird zu 255).

    Dafür hab ich eine Funktion geschrieben, die ein char-Zeiger als 1. Parameter und das entsprechende Zahlensystem als 2.Parameter erwartet.

    Leider funktioniert die Referenzierung nicht:

    int i=ConvertToInt(&c[1],16);
    

    Der Compiler erzeugt damit folgenden Fehler:

    error C2440: 'Initialisierung': 'char (*)[3]' kann nicht in 'char *' konvertiert werden

    Kann mir jemand also sagen, wie ich die Speicheraddresse von c[1] abfragen kann?



  • Taeli schrieb:

    Kann mir jemand also sagen, wie ich die Speicheraddresse von c[1] abfragen kann?

    Mit &c[1]. Aber das willst du nicht. Du willst c[1], nicht die Adresse von c[1]. Und c[1] bekommst du mit.. na ja.. c[1] eben. Oder aber wahlweise auch über &c[1][0]. 😉
    http://ideone.com/xGmgR



  • int ConvertToInt(const char* z, unsigned b)
    {
    	return 123;
    }
    
    int main()
    {
    	char c[3][3] = {"AA","BB","CC"};
    
    	int i = ConvertToInt(&c[0][0],16);
    	i = ConvertToInt(&c[1][0],16);
    	i = ConvertToInt(&c[2][0],16);
    }
    


  • Hat geklappt, danke! 🙂

    Und nochmal danke für den Tipp mit den Klammern bei der Array-Definierung. Wird mir in Zukunft wahrscheinlich etliche Zeilen Code sparen. 😉



  • Taeli schrieb:

    Wird mir in Zukunft wahrscheinlich etliche Zeilen Code sparen. 😉

    Wenn du dir noch mehr Zeit sparen willst, solltest du das nächste Mal überlegen, ob nicht ein std::vector die bessere Wahl als ein Array ist. Das ist nämlich meistens der Fall.



  • daddy_felix schrieb:

    Wenn du dir noch mehr Zeit sparen willst, solltest du das nächste Mal überlegen, ob nicht ein std::vector die bessere Wahl als ein Array ist.

    In dem Fall wäre ein std::array die noch bessere Wahl...



  • Ich stimme meinen vorpostern zu, dass man auf std::vector bzw. array zugreifen sollte, wenn es allerdings umbedingt nen 2Dimensionales Array mit Pointern sein muss (warum auch immer) versuch das mit einem einzigen Pointer zu realisieren.

    template<typename T>
    class Array2D
    {
    	size_t width_;
    	size_t height_;
    	T* pArr;
    
    public:
    	explicit Array2D(size_t width = 0, size_t height = 0);
    	Array2D(const Array2D& rhs);
    	Array2D(Array2D&& rhs);
    	~Array2D();
    	template<typename U> friend void swap(Array2D<U>& lhs, Array2D<U>& rhs);
    	auto operator=(Array2D rhs) -> Array2D&;
    
    	auto width() const -> size_t;
    	auto height() const -> size_t;
    	auto operator[](int x) -> T*;
    	auto operator[](int x) const -> const T*;
    };
    

Anmelden zum Antworten