Avatar billede gumbert Nybegynder
08. juni 2003 - 14:05 Der er 11 kommentarer og
1 løsning

Arrays og funktioner -Har jeg ret

Lige for tiden roder jeg med pointere og reffarencer hvilket fik mig til at tænke på noget.

  For at afprøve det brugte jeg følgende kode:

#include <iostream>

using namespace std;

void funk(int i[])
{
i[0]=2;
i[1]=3;
}

int main()
{
    int i[3];
    funk(i);
    cout<<i[0]<<i[1]<<endl;
    cin>>i[3];
    return 0;
}

og outputtet blev 23.

  Ved normale variabler skal man enten bruge pointere eller reffarencer for at en funktions ændringer forbliver efter den er afsluttet. I oventående eksempel forbliver funktionens ændringer selvom den er afsluttet ergo skal man ikke bruge pointere til array's.

Har jeg ret??
Avatar billede driis Nybegynder
08. juni 2003 - 14:11 #1
Det du egentlig gør, er at sende en pointer med til din funktion ( i ), gennem denne pointer ændrer funktionen den variabel, der er erklæret i main. Sagt på en anden måde, "funk" ændrer i det "i" peger på, og derfor kan det "funk" har skrevet også læses fra main, idet det er den samme hukommelsesplads.
Avatar billede driis Nybegynder
08. juni 2003 - 14:12 #2
Jeg ved ikke om mit svar var med til at gøre forvirringen større. ... ellers er der sikkert en anden, der kan formulere det lidt mere letforståeligt ...
Avatar billede gumbert Nybegynder
08. juni 2003 - 14:16 #3
Jeg er forvirret.

Hvis i bare havde været
int i;

ville funk ikke kunne ændre den
Avatar billede arne_v Ekspert
08. juni 2003 - 14:27 #4
En af C's små finurligheder.

Arrays sende altid over som pointer.

Simple data typer (og structs !) sende default over by value men
kan sende over by reference ved at angive * i funktions erklæringen
og & på argumenterne i selve kaldet.


Du kan verificere at jeg har ret ved at compile:

#include <iostream>

using namespace std;

void funk(int *i)
{
i[0]=2;
i[1]=3;
}

int main()
{
    int i[3];
    funk(i);
    cout<<i[0]<<i[1]<<endl;
    cin>>i[3];
    return 0;
}

det compiler og virker fuldstændige lige sådan !
Avatar billede arne_v Ekspert
08. juni 2003 - 14:27 #5
Iøvrigt:

int i[3];

cin>>i[3];

er ikke så godt.

Du mener:

cin>>i[2];
Avatar billede gumbert Nybegynder
08. juni 2003 - 14:37 #6
D var bare for at stoppe "filen" ;D Ved godt hvad du mener
Avatar billede gumbert Nybegynder
08. juni 2003 - 14:39 #7
LIge en ting. Hvad er mest populært at gøre. Skrive funk(*i) eller bare funk(i)????
Avatar billede arne_v Ekspert
08. juni 2003 - 15:55 #8
Øh.

Det er to helt forskellige ting.

int i;
funk(i);

kalder med en int by value.

int i;
funk(&i);

kalder by reference (=pointer).

int *i;
funk(i);

kalder by reference (=pointer=array)

int *i;
funk(*i);

kalder med en int by value;
Avatar billede gumbert Nybegynder
09. juni 2003 - 10:47 #9
Jeg mente når int i[2], altså når i er et array.....
Avatar billede arne_v Ekspert
09. juni 2003 - 10:52 #10
int i[2];
funk(i);

kalder by reference.

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

tror jeg ikke er legal syntax.
Avatar billede arne_v Ekspert
09. juni 2003 - 10:54 #11
Jo det virker godt nok.

Det må så være det samme som:

int i[2];
funk(i[0]);

hvilket ko altså er noget helt andet.
Avatar billede gumbert Nybegynder
09. juni 2003 - 11:53 #12
:D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester