Gå til innhold

Anbefalte innlegg

Hei igjen alle sammen, har nok et lite spørsmål på lager jeg :D:p

int strlen(const char* S)   //Her trenger jeg litt forklaring...
 {
  int Len=0;      
  while (*S) //Kan jeg få en liten forklaring med *S`en?
    {
     Len++;
     S++;
     }
  return Len;
  }

Skjønner jo liksom denne, men er strlen() en system funksjon eller er det bare en egendefinert en(det ser da veldig slik ut, boka er litt uklar der :ermm: )...

EDIT: Skjønner litt mer her nå men... ;):roll:

Endret av zirener
Lenke til kommentar
Videoannonse
Annonse

while(*S) ..vil si .. "så lenge vi har ett annet tegn enn 0". 0 tolkes som false, alle andre tall tolkes som true.

0 (eller \0) er som du sikkert kjenner til tegnet som brukes for å markere slutten på en c-streng:

 

printf("Hei der \0 Hva skjer?\n");

 

..skriver bare ut "Hei der ".

 

char* s;

cout << *s << endl; // skriver ut det (tegnet) s peker på

cout << s << endl; // skriver ut addressen til det (tegnet) s peker på

 

s++; // nå peker s på neste tegn

 

http://www.augustcouncil.com/~tgibson/tutorial/ptr.html

 

strlen er jo gjerne skrevet av noen den også, selv om det den skal gjøre er beskrevet i en standard .. boka nevner sikkert bare et eksempel på hvordan han/hun som skrev standard-biblioteket til din kompiler (glibc brukes av GCC/MinGW f.eks.) kan ha laget strlen-funksjonen.

Endret av søppel
Lenke til kommentar
while(*S) ..vil si ..   "så lenge vi har ett annet tegn enn 0". 0 tolkes som false, alle andre tall tolkes som true.

0 (eller \0) er som du sikkert kjenner til tegnet som brukes for å markere slutten på en c-streng:

 

printf("Hei der \0 Hva skjer?\n");

 

..skriver bare ut "Hei der ".

 

char* s;

cout << *s << endl;  // skriver ut det (tegnet) s peker på

cout << s << endl; // skriver ut addressen til det (tegnet) s peker på

 

s++; // nå peker s på neste tegn

 

http://www.augustcouncil.com/~tgibson/tutorial/ptr.html

 

strlen er jo gjerne skrevet av noen den også, selv om det den skal gjøre er beskrevet i en standard .. boka nevner sikkert bare et eksempel på hvordan han/hun som skrev standard-biblioteket til din kompiler (glibc brukes av GCC/MinGW f.eks.) kan ha laget strlen-funksjonen.

Ok takker, men \0 tolkes altså som 0(usant)? For da skjønner jeg litt mer.

:w00t::D:green:

 

EDIT: Pluss en ting til

cout << s << endl; // skriver ut addressen til det (tegnet) s peker på

Skriver ikke dette ut hele strengen? Og er det ikke sånn at:

cout << &s << endl;

skriver ut adressen?

Endret av zirener
Lenke til kommentar

Nei, tror ikke søppel tuller..

Er det ikke slik at

cout << *s // skriver ut verdien til variabelen pekeren s peker til,

cout << s // skriver ut adressen til variabelen pekeren s peker til og

cout << &s // skriver ut adressen til selve pekeren s?

 

Eller tuller jeg og nå?

Lenke til kommentar

Det stemmer det der, <BøNilzen>. søppel surra heller ikke. zirener glemte visst at s er en peker.

 

Edit: Når jeg tenker etter er jeg sannelig ikke sikker selv. Siden s er en char* vil jeg tro at std::cout skriver ut strengen, framfor adressen.

 

En rask sjekk viser at:

 

#include <iostream>

int main()
{
char* my_string = "Hello, world!\n";
int i = 5;
int* pi = &i;
std::cout << my_string;
std::cout << i << " " << pi;
std::cout << std::endl;
return 0;
}

 

Som selvfølgelig gir:

 

Hello, world!

5 0012FF88

 

(Der 0012FF88 kan variere).

 

Så da viste det seg selvfølgelig at zirener ikke surra -- Vi andre glemte at s er en char*, og ikke en peker til noe annet.

Endret av Myubi
Lenke til kommentar

Jepp, du tuller (litt) ;)

 

cout << *s //skriver ut tegnet s peker på (dvs. første bokstav i strengen)

cout << s //skriver ut hele strengen

cout << &s //skriver ut adressen til pekeren

cout << (void*)s //skriver ut adressen pekeren peker til

Endret av kjetil7
Lenke til kommentar
char cstreng[128] = "streng";

int tall = 2;

char* strengAdresse = &cstreng;

int* intAdresse = &tall;

Skriver

cout << intAdresse;
en adresse

mens

cout << strengAdresse;
skriver en cstreng?

 

trodda at siden cout << strengAdresse; skrev ut det den pekte på så gjorde

cout << intAdresse det også

 

char* my_string = "Hello, world!\n";
denne forvirrer meg litt, hvilken char peker denne på? Hvis den eksisterer, når forsvinner den? den er vel ikke satt opp i det frie lageret?
Lenke til kommentar
char* my_string = "Hello, world!\n";

denne forvirrer meg litt, hvilken char peker denne på? Hvis den eksisterer, når forsvinner den? den er vel ikke satt opp i det frie lageret?

Pekeren peker til det første elementet, altså H'en, akkurat som med et array. Det får du også vite hvis du skriver std::cout << *my_string;. Stringen eksisterer på stack'en, og forsvinner dermed når den går ut av "scope".

 

trodda at siden cout << strengAdresse; skrev ut det den pekte på så gjorde

cout << intAdresse det også

 

Det har vel blitt sagt allerede, men det er altså char* som er unntaket, ikke omvendt.

Lenke til kommentar

Nei, strenger allokert v.h.a., uhm, "blabla" (string litherals?) eksisterer i det statiske lageret. De blir allokert på forhånd og eksisterer fra start til slutt av programmet, og det er derfor dette går:

 

char const* funk()
{
 return("Hei der!"); // blir seff. det samme som å si char const* s = "Hei der!"; return(s);
}

int main()
{
 cout << funk() << endl;
}

 

trodda at siden cout << strengAdresse; skrev ut det den pekte på så gjorde

cout << intAdresse det også

 

Det har vel blitt sagt allerede, men det er altså char* som er unntaket, ikke omvendt.

 

Slå opp på "function (og operator) overloading" - det er dette som lager "unntak til regler" med hensyn til forskjellige typer her.

 

..f.eks.:

 

void funk(int* a)
{
 // gjør noe
}

void funk(char* a)
{
 // gjør noe annet
}

template<typename T>
void funk<T*>(T* a)
{
}

void funk(MinType* a)
{
// osv ... osv 
}

Endret av søppel
Lenke til kommentar
Slå opp på "function (og operator) overloading" - det er dette som lager "unntak til regler" med hensyn til forskjellige typer her.

Selvfølgelig, men for alle de andre innebygde typene gir std::cout << pbuilt_in_type; adressa til variabelen. Når én av typene, og ingen andre, har den oppførselen, heter det på norsk at den typen (char*) er et unntak. Men det hele er selvfølgelig flisespikkeri.

 

Jeg burde vel dessuten visst at string literals allokeres i BSS, men... Errare human est.

Endret av Myubi
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...