23. januar 2004 - 10:25Der er
19 kommentarer og 1 løsning
Begynder spørgsmål: stjerne operatoren?
Jeg har flere gange forsøgt at lære C++, men er hver gang gået i stå - så snart jeg når til "det med pointere", går jeg i koma :)
Er der nogen der kan komme med en forklaring der er til at forstå for mennesker?
& operatoren forstår jeg - man sætter den foran en variabel, og får så en pointer til den variabel, right?
men * operatoren ... f.eks. forstår jeg ikke hvilken siden den egentlig virker på - f.eks. har jeg både set:
int* nValue;
og
int *nValue;
(der er efter sigende ingen forskel?)
men hvad præcis betyder det?
og hvad med dobbelt-stjerne? f.eks.:
int** arNoget = int*[10];
meget forvirrende...
jeg har programmeret Pascal/Delphi i mindst 10 år, og skrevet store JavaScript/VBScript programmer, både til browser (IE) og server (IIS) ... så jeg er absolut ikke grøn hvad angår programmering generelt, og jeg kan sagtens forstå det meste af C++ generelt, det er sådanset bare pointer operatorerne der smider mig af hesten hver gang...
100 point til den der kan banke det ind i hovedet på mig én gang for alle! :)
a) et array uden bounds er altså det samme some en pointer?
b) stjerne operatoren er egentlig TO forskellige operatorer - når man bruger den til at erklære nye variabler, betyder den "pointer til", men når man bruger den i et statement betyder den "indhold af"?
c) stjerne operatoren virker på det der står EFTER den, ikke før? så man burde vel egentlig skrive:
int *nVar;
og ikke
int* nVar;
for ellers kunne man jo også skrive
int* nVar1, nVar2;
som jo er ret så misvisende, for her blir nVar2 jo IKKE en pointer, hvorimod
Blot lige nogle kommentarer om forskellen på T *x; og T x[];
Man ser fra tid til anden at man laver et array, i en .c/cpp fil:
int Arr[1023];
Og en extern i en .h fil:
extern int Arr[];
Størrelsen på Arr[] er dermed ikke kendt af filer der blot inkluderer .h filen, men det er ofte ikke nødvendigt. Her kunne man ikke bruge "extern int *Arr;", det er ikke det samme.
Hvis man har en funktion der ser sådan ud:
void Func(int Argument[1024]) { ... }
Så er Argument en pointer, størrelsen (i dette tilfælde 1024) bliver ignoreret, og sizeof(Argument) vil være det samme som sizeof(int *) og man kunne lige så vel skrive: void Func(int *Argument).
"størrelsen (i dette tilfælde 1024) bliver ignoreret" - størrelsen bliver vel stadig brugt til range checking (hvis man har slået det til) inde i funktionen?
"og man kunne lige så vel skrive: void Func(int *Argument)" - man kan, det forstår jeg, men jeg går ud fra det ville være dårlig stil at gøre det?
....
C og C++ forekommer mig at være særdeles gammeldags på mange måder. Jeg må indrømme, det tiltaler mig ikke rigtig, f.eks. at det samme symbol (stjernen) fungere som TRE forskellige operatorer i forskellige situationer ... er C# ligeså forvirrende, eller gør det op med nogen af de "fejl" som C og C++ lider af?
findes der overhovedet en compiler til C#, eller skal det køre i en VM ligesom Java?
findes der nogen alternative lignende sprog, compilerede, med Win32 API support?
(undskyld hvis jeg ved godt jeg bevæger mig lidt væk fra emnet nu, men jeg begynder ærlig talt at tvivle på om C/C++ overhovedet er noget "godt" sprog...)
int main() { int a[1111], *p, i; Func(a); Func(p); Func(&i); return 0; }
Man kan lige så godt bruge *Arr som Arr[1024]. Om man foretrækker det ene frem for det andet et mest et spørgsmå om smag og behag. Hvis argumentet skal være et array af 1024 int's kan man dokumentere det ved at bruge Arr[1024], ellers bruges *Arr mest.
Om det er gammeldags ved jeg ikke, for mig virker det naturligt.
En anden forskell på pointer og array, hvis man har: int a[123]; Så er a == &a;
Men hvis man har: int *p; så er p normalt ikke == &p
så Win32 API'en skal droppes (på lang sigt), og vi skal allesammen (før eller siden) tvinges til at lave C# kode der skal køre i en VM?
skræmmende ... jeg mener, hvad med lyd og video og den slags programmer, som laver hundredetusindvis af beregninger i sekundet? den slags kommer da aldrig til at køre ordrenligt i en VM - eller gør det?
Jeg har lavet nogle tests på simple integer og floating point tal knuseri og konklusionen var at C# performede udmærket.
.NET compiler en .NET EXE til en native EXE på runtime og cacher den genererede EXE - og det virker faktisk godt med den viden man har idag.
Synes godt om
Ny brugerNybegynder
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.