Avatar billede bumle90 Nybegynder
07. marts 2004 - 13:42 Der er 10 kommentarer og
1 løsning

reference/pointer spørgsmål igen igen :D

Hej, jeg sidder og nørkler med pointere og referencer, og kan simpelthen ikke forstå hvorfor jeg ikke kan compile følgende program. For mig at se er det logisk korrekt, kan ikke se hvad jeg gør galt. Plz help :)

#include<iostream>
using namespace std;
class referenceTester
{
private:
    int minInt;
public:
    referenceTester(): minInt(0)
    {}

    void testfunk(const int& intptr1,const int& intptr2)
    {
        if (intptr1<intptr2)
            cout<<"1 er mindre";
    }

};
int main(int argc, char* argv[])
{
int* h;
int* i;
*h=5;
*i=6;
referenceTester ref;
ref.testfunk(h,i);
return 0;
}
Avatar billede erikjacobsen Ekspert
07. marts 2004 - 13:45 #1
Du har pointere, men allokerer ikke plads til indholdet.
Avatar billede bumle90 Nybegynder
07. marts 2004 - 13:46 #2
Hmmm okay, Så der står ikke noget i de addresserum som pointerne peger på eller hvad?
Avatar billede bumle90 Nybegynder
07. marts 2004 - 13:53 #3
Evt. et eksempel på hvordan jeg bør gøre så?
Avatar billede arne_v Ekspert
07. marts 2004 - 14:28 #4
Det vil vel give en runtime fejl.

Jeg tror at compile fejlen skyldes at du kalder med pointere, hvor der er
angivet referencer i erklæringen.

Begge fejl skal nok rettes !
Avatar billede arne_v Ekspert
07. marts 2004 - 14:30 #5
#include<iostream>
using namespace std;
class referenceTester
{
private:
    int minInt;
public:
    referenceTester(): minInt(0)
    {}

    void testfunk(const int& intptr1,const int& intptr2)
    {
        if (intptr1<intptr2)
            cout<<"1 er mindre";
    }

};
int main(int argc, char* argv[])
{
int* h = new int[1]; // tilføjet new
int* i = new int[1]; // tilføjet new
*h=5;
*i=6;
referenceTester ref;
ref.testfunk(*h,*i); // tilføjet *
return 0;
}
Avatar billede bumle90 Nybegynder
07. marts 2004 - 14:34 #6
Men hvad er forskellen på en pointer og en reference?
Avatar billede segmose Nybegynder
07. marts 2004 - 15:40 #7
Betragt følgende der gør det samme.
void testfunk(const int& intptr1,const int& intptr2) {
  // ref _er_ variablen
  if (intptr1<intptr2)
    cout<<"1 er mindre";
}

void testfunk(const int *intptr1,const int *intptr2) {
  // pointer _peger_ på variablen.
  if (*intptr1<*intptr2)  // dereferance nødvendig, ellers du lave automatisk fejl.
    cout<<"1 er mindre";
}

Med pointerer kan du gå igennem et array ved at øge pointeren, ex. intptr++; peger så på den int der ligger fysisk lige efter (hvis du tæller pointeren op og der ikke ligger en int lige efter, hvilket vist kun er garanteret for arrays, går det helt galt).
int* h = new int[10]; // h peger på første element.
h++; // nu peger h på andet element.

Referancer -> sikre, mindre flexibel.
Pointer -> flexibel, men farlige.
Avatar billede arne_v Ekspert
07. marts 2004 - 16:25 #8
Jeg plejer at sige at referencer er pointer semantik med ikke pointer syntax.

Jeg lavede engang dette her eksempel til at illustrere forskellene:

#include <iostream>

using namespace std;

class C
{
  private:
      int v;
  public:
      C(int v) { this->v = v; };
      int GetV() { return v; };
      void SetV(int v) { this->v = v; };
};

void test1(C* o)
{
  cout << o << endl;
  o->SetV(1234);
  return;
}

void test2(C& o)
{
  cout << &o << endl;
  o.SetV(12345);
  return;
}

void test3(C o)
{
  cout << &o << endl;
  o.SetV(123456);
  return;
}

int main()
{
  C *o = new C(123);
  cout << o << endl;
  cout << o->GetV() << endl;
  test1(o);
  cout << o->GetV() << endl;
  test2(*o);
  cout << o->GetV() << endl;
  test3(*o);
  cout << o->GetV() << endl;
  return 0;
}
Avatar billede rrn Nybegynder
08. marts 2004 - 08:44 #9
Der er to forskelle på pointere og referencer:
1. Notation
2. En reference er en konstant pointer.

En konsekvens af 2 er at der for referencer ikke er noget svarende til en NULL-pointer. Dvs. en reference kan ikke være udefineret på en veldefineret måde.
Avatar billede arne_v Ekspert
12. april 2004 - 21:38 #10
Lukke tid ?
Avatar billede arne_v Ekspert
12. april 2004 - 21:38 #11
Og et svar fra mig
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