webForumDet fria alternativet

Referens till en vektor

7 svar · 341 visningar · startad av erik_r

erik_rMedlem sedan maj 200083 inlägg
#1

Jag håller sakta men säkert på att lära mig C++.
En sak som jag inte lyckas med är att göra en referens till en vektor.

int vektor[3];
int &test = vektor;
test[1] = 3;

Varför fungerar inte detta och hur ska jag ändra det för att få det att fungera?

PeWMedlem sedan juni 200010 432 inlägg
#2

När det gäller arrays funkar det inte med referenser på det vis du vill, utan där är det pekarnotation som gäller.. men med vanliga variabler funkar detta ju fint:

int vektor = 3;
int &test= vektor;
test = 5;

Här får både vektor och test åtkomst till den minnesplats som hyser talet 3 och senare 5.
Vid array:

    int vektor[3] = {1,2,3};  
    int *test = vektor; //pekaren test pekar på vektor[0]
    test++;   //stega till test[1]
   *test=3;
   NU SER ARRAYEN VEKTOR UT SÅ HÄR {1,3,3}

Referenser är annars kalas som parametrar till metoder / funktioner, eftersom det då inte kopieras en massa variabler. Man bör dock alltid ange dem som const då det annars finns en uppenbar risk att man av misstag råkar ändra de anropande variablernas värden.

FridolfMedlem sedan aug. 2001723 inlägg
#3

int vektor[3];
int &test = vektor;
test[1] = 3;

Varför fungerar inte detta och hur ska jag ändra det för att få det att fungera?

Det funkar inte eftersom en array egentligen är en pekare. Då kan du inte tilldela en variabel av typen int& värdet av din array eftersom de har olika typer.

Om du ska anropa en funktion och skicka med en array med "pass by reference" kan du skriva att funktionen ska ta int* som argument och sedan skicka arrayen. Exempel:

void funktion(int *test) {
  test[1] = 3;
}

int vektor[3];
funktion(vektor);

Om du promt måste använda referenser kan du skapa en referens till pekaren till arrayens första element. Exempel:

int vektor[3];
int *pekare = vektor;
int * & test = pekare;
test[1] = 3;
erik_rMedlem sedan maj 200083 inlägg
#4

Det fungerar faktiskt riktigt bra.
Dock en sak som skapar bekymmer:

Nu går det ju inte att använda
*test[2] = 3;

Och säg att jag har gått till slutet på en vektor genom att använda ++. Hur skriver jag då ut första talet i vektorn eller tilldelar första talet i vektorn ett värde?

erik_rMedlem sedan maj 200083 inlägg
#5

Ahhh hann inte läse Fridolfs inlägg :). Nu fungerar även detta Men...

Ta den här koden som exempel:

#include <iostream.h>

void funktion(int *test)
{
  test[0][1] = 3;
}

int main()
{
	int vektor[3][2];
	funktion(vektor);
	cout << vektor[0][1];
	return 0;
}

Så fungerar inte det när jag har en så kallad flerdimentionell vektor. Varför och går det att använda flerdimentionella vektorer med referenser/pekare?

UlfTMedlem sedan maj 20018 027 inlägg
#6

erik_r skrev:

Så fungerar inte det när jag har en så kallad flerdimentionell vektor. Varför och går det att använda flerdimentionella vektorer med referenser/pekare?

När du deklarerade "int vektor[3][2];", då allokerade du 6 stycken int på en "rad" om man kan uttrycka det så. På något vis håller programmet reda på att du allokerade den som en 2x3-matris. Dock, funktionen du anropar, vet inte det. Därför vet den inte vad du menar med "test[0][1]". Det kan nämligen vara på olika "avstånd" från pekaren "test" beroende på hur många dimensioner du dimensionerade matrisen med. Vad du skulle behöva göra, är att till din funktion, skicka in info om matrisens dimensioner. Sedan får du utnyttja den informationen till att räkna ut vilka index du ska använda i en en-dimensionell vektor där intarna ligger på en rad, för det är en sådan vektor du egentligen har. Sedan når du dina tal med "test[index]", alltså bara ett index.

FridolfMedlem sedan aug. 2001723 inlägg
#7

Om du alltid har samma storlek på arrayerna när du anropar funktionen kan du definiera en datatyp med typedef som du sedan kan använda både när du deklarerar variabler och i funktionen. Exempel:

typedef int specialarray[2][3];
void funktion(specialarray test) {
  test[0][1] = 3;
}

specialarray vektor;
funktion(vektor);

Men det funkar som sagt bara om du alltid skickar 2x3-arrayer till funktionen.

erik_rMedlem sedan maj 200083 inlägg
#8

Tack för hjälpen (och alla fina förklaringar).
Det slutade med att jag gick på fridolfs linje att använda en lååååååång vektor istället för en flerdimentionell.

139 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)