Avatar billede hclarsen Nybegynder
12. juli 2008 - 22:38 Der er 14 kommentarer og
1 løsning

Strenge i C++

Hej alle

Se følgende to udtryk i main:

char* test = "teststreng";

char test[] = "teststreng";

Kan I bekræfte mig i, at der ikke er nogen forskel mellem disse to eksempler?

Dernæst vil jeg spørge om: Hvis vi betragter den første skrivemåde, så vil

cout << &test<< endl;

give mig adressen på vores array, og dermed adressen af vores første element.

Hvis jeg udskriver adressen via printf ("%p \n", test+0);, så får jeg ikke samme adresse? Hvorfor ikke det?
Avatar billede frand Nybegynder
12. juli 2008 - 23:00 #1
Ja, de er ens.

test er en pointer, som peger på første char.
&test er en pointer, som peger på pointeren (test), der peger på første char.
Avatar billede hclarsen Nybegynder
12. juli 2008 - 23:07 #2
Udfra char* test = "teststreng" ønsker jeg at finde adressen på det n'te element. Hvorledes gør jeg?
Avatar billede arne_v Ekspert
12. juli 2008 - 23:48 #3
Der er en lille forskel på de to eksempler.

char* test = "teststreng";

vil typisk være en readonly streng mens

char test[] = "teststreng";

type vil kunne rettes i !
Avatar billede arne_v Ekspert
12. juli 2008 - 23:49 #4
test[i] og *(test+i) bør virke med begge syntaxer
Avatar billede hclarsen Nybegynder
13. juli 2008 - 00:02 #5
Arne: Ja, det virker også - dette giver mig tegnene. Men hvis jeg udfra char* test = "teststreng" vil finde adressen på en af vores chars., hvorledes gør jeg så?
Avatar billede arne_v Ekspert
13. juli 2008 - 00:14 #6
strchr funktionen (eller måske strstr funktionen)
Avatar billede arne_v Ekspert
13. juli 2008 - 00:16 #7
Avatar billede hclarsen Nybegynder
13. juli 2008 - 00:19 #8
Jeg tror lidt jeg ikke helt forstår udtrykket char* test = "teststreng"; så. Er dette udtryk ækvivalent med:

char test[] = "teststreng", *test; test = &test;

?
Avatar billede arne_v Ekspert
13. juli 2008 - 00:36 #9
Nej.

char* test = "teststreng";

allokerer en pointer (på 32 bit systemer er det 4 byte) som peger på et
sted i readonly memory hvor der ligger 11 bytes med en streng.

char test[] = "teststreng";

allokerer en pointer (på 32 bit systemer er det 4 byte) som peger på et
sted i read & write memory hvor der ligger 11 bytes med en streng.
Avatar billede segmose Nybegynder
13. juli 2008 - 01:27 #10
char* test = "teststreng"; // test er en pointer til char(s)
const char* consttest = "teststreng"; // test er en pointer til const char(s)

Jeg kan ikke huske at have set nogen kompiler der ikke tillader at man retter i det test peger på, man kan selvfølgelig ikke skrive ud over den afsatte plad uden at lade i udefineret tilstand.

Siger standarten egentlig noget andet? jeg kan dårligt tro det da test ikke er const, kan den derfor ikke pege på noget der er const uden at bryde med sin definition?
Avatar billede arne_v Ekspert
13. juli 2008 - 02:57 #11
int main()
{
    char* test = "teststreng";
    test[0] = 'T';
    return 0;
}

crasher med GCC.

Medmindre man bruger GCC 3.x og angiver -fwritable-strings.

(de fjernede optionen i GCC 4.x)

Med MS VC++ skal man bruge /GF for ar få dem i readonly.
Avatar billede arne_v Ekspert
13. juli 2008 - 03:05 #12
Standard mæssigt mener jeg at det er undefined behavior at forsøge at ændre i en
string literal.
Avatar billede arne_v Ekspert
13. juli 2008 - 03:07 #13
Avatar billede arne_v Ekspert
13. juli 2008 - 03:09 #14
Men nu vi er ved det "korrekte", så er 13/07-2008 00:36:36 også forkert.

char test[] = "teststreng";

allokerer et sted i read & write memory hvor der ligger 11 bytes med en streng -
når man bruger det array vil der ofte blive lavet en en pointer (på 32 bit
systemer er det 4 byte) som peger på det memory.
Avatar billede arne_v Ekspert
30. august 2008 - 01:58 #15
all set ?
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