Gå til innhold

spørsmål om casting...


Anbefalte innlegg

Jeg har bare skumma gjennom her, men

std::cout << (int*) a << std::endl;

skriver ut verdien til a casta til en int-peker. Dvs. samme verdien som a er satt til, men vil sannsynligvis bli skrevet ut som en hex-verdi.

 

Følgende er vel en grei demonstrasjon:

#include <iostream>

int main()
{
   int a = 10;
   
   std::cout << "a: " << a << std::endl;
   std::cout << "a castet til en int-peker: " << (int*) a << std::endl;
   std::cout << "adressen til a: " << & a << std::endl;
}

Endret av kjetil7
Lenke til kommentar
Videoannonse
Annonse
Det som skjer er at a castes til en adresse, og skrives ut som adressen 10 (hex: A). Nøyaktig hvordan en adresse skrives ut, kan variere fra plattform til plattform.

den utskriften gir ingen adresse. Den gir verdien til variabelen.

Den skrives ut som en adresse. Det betyr at den blir formattert på samme måte som en int* blir formattert når den skrives ut. Altså, variabelen a blir skrevet ut som om den var en adresse, selv om den ikke er det.

 

Edit: Innlegg 666 :devil:

Endret av Myubi
Lenke til kommentar
Det som skjer er at a castes til en adresse, og skrives ut som adressen 10 (hex: A). Nøyaktig hvordan en adresse skrives ut, kan variere fra plattform til plattform.

den utskriften gir ingen adresse. Den gir verdien til variabelen.

Den skrives ut som en adresse. Det betyr at den blir formattert på samme måte som en int* blir formattert når den skrives ut. Altså, variabelen a blir skrevet ut som om den var en adresse, selv om den ikke er det.

 

Edit: Innlegg 666 :devil:

Men i alle dager... er det ikke det jeg skrev da?

Lenke til kommentar

Ting er vel oppklart, men la oss kverrulere litt.

 

Det som skrives ut er faktisk en adresse. For det er ikke a som skrives ut, men a castet til en peker (adresse) til int.

 

La oss si at man gjør slik i stedet:

int a=10;
int *b=(int *)a;
cout << b;

Dette er ekvivalent, bare at jeg bruker en hjelpevariabel for å illustrere hva som skjer.

 

Det som skrives ut er altså en adresse, men det er ikke adressen til a. Den kjenner vi ikke. Adressen vi skriver ut er 10 (eller 0x000a eller $000a eller en annen måte å skrive adresse på), og hva som er på adresse 10 er uspesifisert.

Lenke til kommentar

Det som skrives ut er faktisk en adresse. For det er ikke a som skrives ut, men a castet til en peker (adresse) til int.

 

La oss si at man gjør slik i stedet:

int a=10;
int *b=(int *)a;
cout << b;

Dette er ekvivalent, bare at jeg bruker en hjelpevariabel for å illustrere hva som skjer.

 

Det som skrives ut er altså en adresse, men det er ikke adressen til a. Den kjenner vi ikke. Adressen vi skriver ut er 10 (eller 0x000a eller $000a eller en annen måte å skrive adresse på), og hva som er på adresse 10 er uspesifisert.

Dette klarer jeg ikke å forstå..... :roll:

 

Hvorfor er bestandig adressen det som som det verdien til variabelen a har da?

Lenke til kommentar

ok - bare for å få avsluttet dette: det som skjer er at a blir(midlertidig) kastet til en int * og derfor blir det tolket som om innholdet(f.eks 10) var en adresse. Kan jeg konkludere med det?

Endret av frg
Lenke til kommentar

Jepp.

 

For øvrig får du lov til å spørre videre om det er noe mer som er uklart. Å si at det var litt teskje inne i bildet var på ingen måte klaging eller kritikk. Spørsmål som går på forståelse (eller manglende sådan) er en velkommen avveksling fra de (litt for) vanlige «Hvordan lære C++?», «Hvordan få programmet til å vente på brukerinteraksjon?», «Bør jeg lære C eller C++?» osv. Så bare spør :)

Lenke til kommentar
ok - bare for å få avsluttet dette: det som skjer er at a blir(midlertidig) kastet til en int * og derfor blir det tolket som om innholdet(f.eks 10) var en adresse. Kan jeg konkludere med det?

Dette er ingen adresse: a

Dett er en adresse: (int *)a

 

Men det siste er ikke a, det er bare en andresse, men den er ikke tilordnet noen variabel. Så variabelen a endrer seg ikke.

 

Men glem dette om du ikke forstår hva jeg mener. Det er ikke så viktig.

Lenke til kommentar
  • 2 uker senere...

Casten blir jo brukt litt her og der.

 

 

int *a = (int *)100; // Peker "a" til den absolutte adressen 100

 

Dette er også lovlig:

a = (int*) 100;

a++ ; // a er nå 104.

 

 

MS-DOS var flittig bruker av absolutte adresser. ( For de som programmerte på den tiden så skjønner dere sikkert hvorfor tallet 100).

 

For andre: MS-DOS forventet alltid at "starten" på et program alltid ville ligge på den absolutte minneadressen 0x100h. (256 i 10-base).

 

 

Ellers er det mye brukt i hardware-instruksjoner. Hvor starter en prosessor når den blir satt spenning på?

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å
×
×
  • Opprett ny...