C++ - Syntax

Hallo, ich hab da ein Problem mit der C++ - Syntax.

int values[2][2];
??? GetZeiger(int i) { return values + i; }

Der Rückgabetyp von GetZeiger() müsste Zeiger auf int[2] sein. Ich weiss aber nicht, wie ich das Schreiben soll.
Vielen Dank im Voraus.
Gert

int* GetZeiger(int i)…

Da ein Pointer auf Array nur die 1. Array stelle angibt. Ist also int* für alle int arrays ein pointer. Will man dann auf ein bestimmten Arrya zugreifen wird das mit intpointer[arrayelementNr].

Also nur den Typ als Pointer (int*), da der Pointer nicht beschreibt wie gross das Array ist, sondern nur die Anfangsposition des 1 Elements.

Hoffe du kannst damit was anfangen.

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

Hallo,

ich hab da ein Problem mit der C++ - Syntax.
int values[2][2];
??? GetZeiger(int i) { return values + i; }
Der Rückgabetyp von GetZeiger() müsste Zeiger auf int[2] sein.

Ich hab mal ein Beispiel draus gebastelt,
durcharbeiten musst Du Dich selber :wink:

 int values[2][2] = {
 { 1, 2 },
 { 3, 4 } };

 int (\* GetZeiger(int i) )[2] 
{ 
 return values + i; 
}

 int main( void )
{
 int (\*zg)[2];
 int k = 0;
 zg = GetZeiger(k);
 printf("%k =\> { %d, %d }\n",(\*zg)[0], (\*zg)[1] );

 k = 1;
 zg = GetZeiger(k);
 printf("%k =\> { %d, %d }\n",(\*zg)[0], (\*zg)[1] );

 return 0;
}

Grüße

CMБ

Ist das erlaubt ?:wink:
Hallo CMБ

ich denke mal, dass es erlaubt ist, aber gesehen habe ich dass noch nie. Gibts dafür in C eine „Erlaubnis“ oder eine Allgemeinregel, oder sogar ein Anwendung?

int (* GetZeiger(int i) )[2];

Gruß
achim

Hallo Semjon, vielen Dank.
Funktioniert (zumindest ist der Compiler damit zufrieden).
Sieht auf den 1. Blick komisch aus, ist aber nach einigem Nachdenken doch recht logisch.

int values[2][2];
int (*GetZeiger(int i))[2] { return values + i; } !!!

mit vielen Grüßen
Gert

ja
Hallo Achim, ja es ist erlaubt.

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

Hallo,
vielen Dank für Deine Mühe, aber die Lösung : siehe oben.
mfg

int* GetZeiger(int i)…

Da ein Pointer auf Array nur die 1. Array stelle angibt. Ist
also int* für alle int arrays ein pointer. Will man dann auf
ein bestimmten Arrya zugreifen wird das mit
intpointer[arrayelementNr].

Also nur den Typ als Pointer (int*), da der Pointer nicht
beschreibt wie gross das Array ist, sondern nur die
Anfangsposition des 1 Elements.

Hoffe du kannst damit was anfangen.

Hallo Achim

ich denke mal, dass es erlaubt ist, aber gesehen habe ich dass
noch nie. Gibts dafür in C eine „Erlaubnis“ oder eine
Allgemeinregel, oder sogar ein Anwendung?
int (* GetZeiger(int i) )[2];

Das Problem des C-Designs ist hier iirc, dass
man die Array-Designation [2] nicht direkt
hinter den Datentyp schreiben kann:

 int\*[2] GetZeiger(int i);
  • denn dann würde auch die Klammerung
    unnötig werden, die [] klebt ja nach links.
    In Java z.B. wurde das dann letzlich behoben.

Daher sieht man die „unschöne“, weil nicht den
C-Sehgewohnheiten konforme, Konstruktion

 type ( \*func(type para) ) [N]

wirklich nicht so oft.

Man würde ja hier die Sache vereinfachen, in dem man,
wie Du weisst, einen Typ für die wesentliche
Komponente „int [2]“ definiert:

 typedef int INT2[2];

 INT2 values [2] = {
 { 1, 2 },
 { 3, 4 } 
 };

 INT2\* GetZeiger(int i)
 { 
 return values + i; 
 }

 int main( void )
 {
 INT2 \*zg;
 ...

Grüße

CMБ

1 Like