[C++] referenz return

Katsumi

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.336
Kann mir bitte einer hierbei helfen ;)
Ich möchte dieses Beispiel mit einem Mehrdimensionalem Array haben.
Also statt int* p=new int[2];
soetwas wie int* p=new int[2][2]; was allerdings total falsch wäre ;)

PHP:
#include <iostream>
using namespace std;

void foo(int value, int* buffer)
{
  buffer[0]=value;
  buffer[1]=-value;
}

int main()
{
  int* p=new int[2];
  foo(7, p);
  cout<<p[0]<<'\n'<<p[1]<<'\n';
  delete [] p;
}
 
Kann dir zwar nicht helfen (kann nur n bissel Java) aber interessehalber muß ich fragen:

Was ist den int* ?!?
 
edit:

sorry hatte mich geirrt, funktioniert nicht so wie ich gesagt hatte.
 
Zuletzt bearbeitet:
also der reihe nach:
ein int* ist ein zeiger(das schnelle ding das bei java total fehlt :p) auf int.

allerdings verstehe ich nicht ganz was du willst(ne referenz returnt man in etwa so: return &var;). allerdings hab ich keine ahnung was dir das helfen würde. allerdings verstehe ich deinen code ansonsten auchnet so wirklich - aber ein mehrdimensionales array ist eigentlich ganz einfach:
Code:
int** test = new int*[2];
test[0] = new int[2];
test[1] = new int[2];

dadurch bekommst du ein ganz normales 2 dimensionalles array. test[0][0] wäre also der erste punkt.

P.S.: bevor die frage kommt: ein int** is ein zeiger auf einen zeiger auf ein int ;). je mehr dimensionen desto mehr zeiger sind das dann. bei einem 3 dimensionallen brauchst du also einen zeiger auf einen zeiger auf einen zeiger auf ein int(also int***).

EDIT: natürlich zu späht.. so wie oben könnte man das wohl auch machen, is dann sogar einfacher *g*.

EDIT2: aber wie immer würde ich eher einen std::vector empfehlen ;).
 
Zuletzt bearbeitet:
aso... aber ich hab' noch 'ne Frage :D : Was ist dann der Operator für die Multiplikation?
 
Der * (Stern) Operator ist der Operator für einen Dereferenzierung eines Zeigers.

Wenn du zwei Variablen multiplizierst, dann nimmst du auch den *. Der Compiler erkennt aus dem "Zusammenhang" ob du einem Zeiger folgen willst, oder ob es etwas zu multiplizieren gibt.
 
Ich habe ein Schachbrett 8x8 und möchte in der Funktion direkt mein Array bearbeiten und keine Kopie.

Also ich habe
int brett[8][8];

und möchte jetzt in einer Funktion das Array verändern, per Referenz(Zeiger).
 
Code:
int brett[8][8]

void deineFunktion( int** einBrett, int value, int posX, int posY)
{
    // Feldgrenzen prüfen; sollte z.B. auf brett[9][9] geschrieben werden dann "Autsch"!
    if( (posX<0) || (posX>7) || (posY<0) || (posY>7))
        return;    // falsche Position

    einBrett[posX][posY] = value;
}

// Aufruf dann so
deineFunktion( brett, 123, 4, 6);
Du muss ja irgendwoher die Werte für die Position im Array her bekommen.
Ich würde das auch als Parameter machen.

Wegen den Feldgrenzen.
Auf ein Array mit 8 einträgen kannst du mit den Indizes 0 bis 7 zugreifen. Wenn du mit array[8] darauf zugreifst, dann zeigst du "hinter" das Array. Das kann sehr böse enden.
 
Zuletzt bearbeitet:
dann müsstest du ein &int** bzw. eben direkt int** verlangen(arrays sind in c ja nur zeiger). das erste wäre dabei die referenz.

die funktionsdeklaration(oder definition!? ich bring das immer durcheinander ;)) müsste also so aussehen:
Code:
void foo(int value, int** buffer)
wenn du das array direkt übergeben willst. einen zeiger auf das array wäre schwachsinn da das array ja schon ein zeiger ist ;). als referenz müsste also nurnoch ein & vor das int**.
 
@Baron
Das sah so gut aus .. aber leider:

Zeile 66: deineFunktion( brett, 123, 4, 6);

[C++ Fehler] Unit1.cpp(66): E2034 Konvertierung von 'int ( *)[8]' nach 'int * *' nicht möglich
[C++ Fehler] Unit1.cpp(66): E2342 Keine Übereinstimmung des Typs beim Parameter 'einBrett' ('int * *' erwartet, 'int ( *)[8]' erhalten)
 
Ja?
Äh, mist. Jetzt weißt du warum mehrdimensionale Array nicht so toll sind.

Spiel ein bisschen mit den Paramtern rum.
Will heißen, dass du so etwas ausprobierst: void meineFunktion( int* einBrett[8], ...)

Zeiger sind mies. Ich vermeide mehrdimensionels Gefrickel immer.
Letztens hatte ich nur Ärger mit einer Tabelle die Funktionszeiger enthielt.
 
Nimm einfach ein eindimensionales Array, und berechne den Index selbst mit:
Code:
int* brett = new int [8 * 8];
Index = Nx * y + x;
Nx ist dabei die Anzahl der Elemente in der x-Dimension, bei einem Schachbrett also 8.

Ansonsten kannst du das auch ohne Pointer mache, in etwa so:
Code:
int [8][8] brett;
 
Zuletzt bearbeitet:
Zurück
Oben