Avatar billede bolmer Nybegynder
16. marts 2005 - 16:28 Der er 8 kommentarer og
1 løsning

Problemer med pointere

Jeg prøver at forstå et eksempel fra K&R side 101.:

#define ALLOCSIZE 10000

static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;

char *alloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n){
      allocp += n;
      return allocp - n;
      } else
          return 0;
}


I if parentesen svarer allocbuf til index 0. Man ligger så ALLOCSIZE til index 0 og ender derfor på det sidste index i listen (index 9999). Dernæste trækker man allocp fra (som ved første kørsel svarer til index 0) og får derfor 9999. Hvis n så fx er 10 så evaluere if sætningen til sand.

Er denne gennemgang korrekt?

Jeg kan ikke forstå hvorfor allocp svarer til index 0. Når der i starten skrives:

static char *allocp = allocbuf;

så betyder dette vel bare at *allocp er ligmed indholdet på index 0 i allocbuf listen.

Normalt vil man vel skriver:

allocp = allocbuf;

for at angive at allocp peger på det første element i listen.
Avatar billede frosig Nybegynder
16. marts 2005 - 16:42 #1
Når du erklærer et array, så har du egentlig kun en pointer til det første element, så når du skriver static char *allocp = allocbuf, så erklærer du en char pointer, der peger på første element (index 0) i arrayet allocbuf
Avatar billede frosig Nybegynder
16. marts 2005 - 16:46 #2
Sorry, læste ikke lige det hele... Du har helt ret! *'en betyder bare, at det er en pointer til en char og ikke en char. Du kunne have gjort således

static char allocbuf[ALLOCSIZE];
static char *allocp;

allocp = allocbuf;
Avatar billede bolmer Nybegynder
16. marts 2005 - 16:48 #3
men *allocp = allocbuf svarer det ikke til indholdet på index 0 og ikke addressen på det første element som er index 0.

allocp = allocbuf; // allocp er en pointer der peger på "adressen" til første element
*allocp = allocbuf; // indeholder værdien på adresse 0.
Avatar billede arne_v Ekspert
16. marts 2005 - 17:06 #4
*allocp som erklæring og *allocp i et udtryk er 2 forskellige ting !
Avatar billede bertelbrander Praktikant
17. marts 2005 - 00:52 #5
allocbuf + ALLOCSIZE - allocp kan oversættes til:
starten af bufferen + størrelsen på bufferne - nuværende position

Hvilket er det antal bytes (da allocbuf er char []) der er tilbage i bufferen.

allocbuf og allocp er addresser.

en addresse + et tal er en addresse, en addresse - en addresse er et tal
Avatar billede mookid8000 Nybegynder
18. marts 2005 - 09:34 #6
det der forvirrer dig er muligvis at et array er det samme som en pointer... dvs flg er ækvivalente:

char * tjek = new char[100];
char tjek[100];

du kan få fat i char nr 40 i dem begge to med tjek[39] - og du kan få en pointer til char nr 1 i begge to med bare tjek - ligesom du kan lave pointere til en hvilken som helst char i arrayet med tjek + n - og det er det der sker i dit eksempel der, der bliver bare lavet fræk pointeraritmetik fordi sådan er Kernighan og Ritchie, de ka ik la vær
Avatar billede arne_v Ekspert
18. marts 2005 - 09:47 #7
Ovenstående er kun næsten ækvivalent !

Hvis du vil se forskellen så chekc f.eks. sizeof(tjek)
Avatar billede mookid8000 Nybegynder
18. marts 2005 - 11:27 #8
hehe, jeg VIDSTE at du ville komme med en kommentar ;O)
Avatar billede bolmer Nybegynder
06. maj 2005 - 21:15 #9
Bruger linux istedet
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