pointer functies in c, i don't get it!

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cpt.Sponder
  • Registratie: Januari 2008
  • Laatst online: 06-02-2024
Hoi Allen,

Ik ben mezelf c aan het leren, maar kom niet helemaal uit functies die met pointers omgaan.
Na de nodige tutorials gelezen te hebben en youtube filmpjes bekeken te hebben dacht ik het een heel eind te begrijpen, maar toch kom ik er niet helemaal uit.

Zou iemand mij misschien een klein stukje uitleg kunnen geven over het onderstaande?
Mijn dank is groot! :)
btw: het is voor een PIC microcontroller projectje en de compiler welke ik gebruik is de light versie van High Tech C v 9.81.

Ik zou graag een string willen "parsen" naar 2 verschillende strings, een voor en een na een speciaal teken, zoals:
char string[] = "This is our # test string";
het doel is dus om 2 strings over te houden met
char a[] = "This is our "
char b[] = " test string"

Nu ben ik hiervoor een beetje voor aan het experimenteren met strchr, de functie die voor ons het speciale teken opzoekt.

Als ik onderstaande code uitvoer:
C:
1
2
3
4
5
6
      char string[] = "This is our # test string";
      char *p = strchr(string, '#');

      printf("pointer contains: %s \r\n", p);
      printf("pointer has a value of: %c \r\n", p);
      printf("pointer points to adress value: %i \r\n", &p);

Dan krijg ik terug:

pointer contains: # test string
pointer has a value of: ,
pointer points to adress value: 78

Nou de bovenste snap ik, die laat de string zien vanaf de waarde van de pointer van het # teken.
Alleen snap ik de tweede niet. Deze laat met %i de waarde 44 zien, en met de %c de komma.
Nu is in de ascii tabel snel genoeg opgezocht dat de , inderdaad de decimale waarde van 44 heeft; Maar wat ik niet begrijp is waar deze waarde 44 vandaan komt? Kan iemand mij dit uitleggen zodat ik weer verder kan puzzelen?

Alvast bedankt!
Gr. Sander.

Edit: code blok toegevoegd

Acties:
  • 0 Henk 'm!

  • MikeN
  • Registratie: April 2001
  • Laatst online: 12:51
Als je er in die 2e regel nou eens *p van maakt, snap je het dan wel?

[edit]
Hint 2 zijn misschien wat van de warnings die ik op de laatste 2 regels krijg bij het compilen ;-)
main.c:11: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
main.c:12: warning: format ‘%i’ expects type ‘int’, but argument 2 has type ‘char **’

[ Voor 73% gewijzigd door MikeN op 25-06-2012 22:48 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Cpt.Sponder, kan je je code tussen [code=c][/] blokken plaatsen. Maakt het wat leesbaarder :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Cpt.Sponder
  • Registratie: Januari 2008
  • Laatst online: 06-02-2024
Als je er in die 2e regel nou eens *p van maakt, snap je het dan wel?
Nou eerlijk gezegd niet!
Hoewel hij nu netjes de '''#' als output geeft, begrijp ik nog steeds niet waar hij die waarde 44 vandaan haalt.
Tenzij je me verteld dat *p me de waarde van het adres terug geeft, en p het adres waar de pointer naar toe wijst? (dus dat die 44 het adres is.)
Maar wat doet &p dan? (waarde 78)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Je code is fout. Je zou een pointer dereference moeten doen op regel 5 (*p in plaats van p) en op regel 6 een cast naar integer ((int)p in plaats van &p).

Die 44 is toevallig (een deel van) het adres van het hekje in de string, maar da's eigenlijk geen interessante informatie. Op dezelfde manier geeft &p je een pointer naar p (het adres van p dus) wat een ander getal is, maar op zichzelf ook niet bijster interessant.

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Cpt.Sponder schreef op maandag 25 juni 2012 @ 23:09:
[...]

Tenzij je me verteld dat *p me de waarde van het adres terug geeft, en p het adres waar de pointer naar toe wijst? (dus dat die 44 het adres is.)
Maar wat doet &p dan? (waarde 78)
Een pointer is zelf ook maar gewoon een variabele he, eigenlijk een unsigned integer met zoveel bits als geheugenadressen op je platform hebben en met het geheugenadres van een andere (virtuele) variabele als waarde. Het is verder geen magisch iets, het wijst slechts ergens naar.

Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Misschien is het handig om je code eerst gewoon op je PC te testen voordat je het voor je microcontroller maakt. Het lijkt allemaal redelijk standaard c code. Op een PC, met bv Visual Studio is het veel makkelijker debuggen.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// een char
char chr1 = '#'; 

// p wordt een pointer naar chr1.
// de & operator geeft je het geheugenadres van de variabele.
char* p = &chr1; 

// chr2 krijgt nu de waarde van chr1.
// de * operator geeft de char waarde op het geheugenadres van p.
char chr2 = *p; 


printf ("adress of chr1 = %x, p has value %x\n", &chr1, p);


char* str  = "abc";
printf ("adress of str[0] = %x, str has value %x\n", &str[0], str);

char * p2 = &str[1];
printf ("str[1] = %c, p2 points to %c\n", str[1], *p2);

p2 = p2 + 1;
printf ("str[2] = %c, p2 points to %c\n", str[2], *p2);

p2 = p2 + 1;
printf ("strings in c end with %d\n", *p2);

[ Voor 22% gewijzigd door epic007 op 26-06-2012 08:52 ]


Acties:
  • 0 Henk 'm!

  • Cpt.Sponder
  • Registratie: Januari 2008
  • Laatst online: 06-02-2024
Dank voor jullie antwoorden!
Het is me iets duidelijker!
Ik ga hier eens flink wat meer mee experimenteren om dit mezelf eigen te maken.
Pagina: 1