Avatar billede neocron Nybegynder
05. januar 2005 - 20:33 Der er 7 kommentarer og
1 løsning

Pointere og bitwise operatorer

Hejsa.
Jeg er gået igang med at terpe lidt læsemateriale om C++ og jeg har fundet nogle online bøger. En del af det giver fint mening, men jeg er efterhånden nået til det, som jeg aldrig har forstået, og som jeg ikke rigtig får noget ud af at afprøve eksempler med - pointere, referencer og bitwise operatorer.

F.eks. kan man med pointere modificere en variabel, som ligger udenfor en funktion. En ting er at man kan det, men man ser jo pointere og referencer tit og ofte, men jeg mangler virkelig en ide om, hvad disse kan bruges til, rent praktisk. Et eksempel, der bare viser at man kan ændre en udenforliggende variabel med pointere giver ikke megen mening for mig.

Ligeledes gælder bitwise operatorer, og de er om muligt endnu mere forvirrende for mig. Jeg lavede et lidt underligt hjemmestikket eksempel, hvis output jeg overhovedet ikke forstår:

#include <iostream>
using namespace std;

int main() {
        int a;
    for(int i=0; i<10; i++) {
        a = 1 << i;
        cout << a << endl;
    }
    return 0;
}

Giver outputtet:
1
2
4
8
16
32
64
128
256
512

Men hvorfor? Hvis jeg i øvrigt prøver at ændre
int a = 1 << i;

til f.eks.

int a = 1 & i;
int a = 1 | i;
int a = ~i;

Er forvirringen stadig stor. Hvad kan jeg gøre for at opnå bedre forståelse af pointere, referencer og bitwise operatorer? Jeg er virkelig lidt på bar bund.

Den online-bog, jeg følger, kan findes her (Thinking in C++):
http://www.ceremade.dauphine.fr/~msfr/cpp/C++_Eckel/TIC2Vone-distribution/html/Frontmatter.html

Jeg håber, nogle kan oplyse mig lidt. Det er noget af en smørre, men håber I forstår nogenlunde hvad jeg mener.

På forhånd tak.
Avatar billede arne_v Ekspert
05. januar 2005 - 20:35 #1
Med hensyn til bitwise operatorer så prøv og læs:
  http://www.eksperten.dk/artikler/505
Avatar billede arne_v Ekspert
05. januar 2005 - 20:39 #2
Med hensyn til pointere og referencer lavede jeg angang dette eksempel som
gerne skulle illustrere:

#include <iostream>

using namespace std;

void test1(int v)
{
  v++;
}

void test2(int& v)
{
  v++;
}

void test3(int *v)
{
  (*v)++;
}

static int v123 = 123;

int test4()
{
  return v123;
}

int& test5()
{
  return v123;
}

int *test6()
{
  return &v123;
}

int main()
{
  int v = 0;
  test1(v);
  cout << v << endl;
  test2(v);
  cout << v << endl;
  test3(&v);
  cout << v << endl;
  cout << test4() << endl;
  cout << test5() << endl;
  cout << *(test6()) << endl;
  return 0;
}
Avatar billede neocron Nybegynder
05. januar 2005 - 20:54 #3
Tak - det vil jeg prøve at kigge nærmere på.
Hvad sker der når de begynder at bruge void-pointere og så caster dem til at være int pointere osv? Hvad er ideologien i sådan noget?
Generelt sådan nogle lidt kryptiske ord som
(char *) something;
Eller noget i den dur der.
Avatar billede arne_v Ekspert
05. januar 2005 - 20:57 #4
En void pointer er bare en pointer til "noget". Den er praktisk fordi man kan gemme
pointere til int, pointere til char, pointere til hvad som helst i sådan en, men
inden man kan bruge den skal man have castet den om til hvad den virkeligt er.
Avatar billede neocron Nybegynder
05. januar 2005 - 21:09 #5
Okay! Det må jeg da prøve at eksperimentere med. Jeg sidder og kigger lidt på artiklen, og den er sørme skrevet af dig.
Jeg er imidlertid ikke den største matematiker, men jeg har da fundet en forklaring på mit problem - vidste ikke at << var det samme som * 2!

Men mit problem er de hexadecimale tal.
0x1F, 0x5A f.eks.

Fra artiklen:
0x1F er en hexdecimal konstant (med samme værdi da 1*16+15=31)
--
Hvorledes finder man tallene 1, 16 og 15 i 0x1F?

Det samme problemer ligger ved oktal, hvor
037 er 3*8+7=31. Hvor fåes disse tal fra?
Avatar billede arne_v Ekspert
05. januar 2005 - 21:40 #6
hexa decimal = 16 tals system

0 = 0
1 = 1
.
.
.
9 = 9
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15

decimal 31 = 3*10+1

hex 1F = 1*16+15

octal = 8 tals system

octal 37 = 3*8+7
Avatar billede neocron Nybegynder
05. januar 2005 - 22:02 #7
Ohhhh NU tror jeg, at jeg har forstået det. Mange tak for hjælpen - jeg tror, det er på tide med et svar, du har atter været til glimrende og oplysende hjælp!
Avatar billede arne_v Ekspert
05. januar 2005 - 22:06 #8
svar
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