Avatar billede mindplay Nybegynder
23. januar 2004 - 10:25 Der 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! :)
Avatar billede arne_v Ekspert
23. januar 2004 - 11:00 #1
int* nValue;

og

int *nValue;

er det samme og erklærer variablen nValue til at være n pointer til int.

int** arNoget;

erklærer arNoget variabel til at være en pointer til en (formentligt flere)
pointer(e).
Avatar billede arne_v Ekspert
23. januar 2004 - 11:01 #2
Eksempel:

int v = 123;
int *p = &v;
int **p = &p;
Avatar billede arne_v Ekspert
23. januar 2004 - 11:01 #3
& er "address of" operatoren.
Avatar billede arne_v Ekspert
23. januar 2004 - 11:03 #4
Det er mange år siden at jeg har brugt pointere i Pascal men:

type
  myinteger = integer;
  pointermyinteger = ^myinteger;
  pointerpointermyinteger = ^pointermyinteger;
Avatar billede bertelbrander Novice
23. januar 2004 - 16:27 #5
Der er to steder man bruger "stjerne operatoren":

1: char *x; Erklærer x som en pointer.
2: *x = 'y'; Dvs. indholdet af x, som er en char hvis x er en char *, det er det samme som x[0].

Stjernen i det sidste eksempel hedder vist "indirection operator".
Avatar billede noden Nybegynder
23. januar 2004 - 17:34 #6
Nu vi snakker pointere til pointere.
"char * ArrVar[];" er sådan set det samme som "char ** ArrVar;"
Avatar billede bertelbrander Novice
23. januar 2004 - 20:35 #7
Ja, char *ArrVar[] er det samme som char **ArrVar.

Men char *ArrVar[10] er ikke det samme som **ArrVar.
Avatar billede mindplay Nybegynder
24. januar 2004 - 20:46 #8
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

int *nVar1, *nVar2;

erklærer to pointere. korrekt?
Avatar billede arne_v Ekspert
24. januar 2004 - 20:52 #9
a)

Kun i nogen sammenhæng.

b)

Ja.

(foruden naturligvis gange !)

Jeg skriver også altid * foran variabel navn fremfor efter typenavn.

Korrekt. (men det er omvendt i C# !)
Avatar billede arne_v Ekspert
24. januar 2004 - 20:52 #10
Hov jeg glemte at sætte c) ind, men du kan vel se hvor det hører hjemme.
Avatar billede mindplay Nybegynder
24. januar 2004 - 21:18 #11
a) hvornår er et array så IKKE en pointer til det første element i array'et?

det med gange havde jeg slet ikke tænkt på - men hvad gør man egentlig så, hvis man vil gange med det som en pointer peger på? altså f.eks.:

int nVarA = 10;
int *nVarB;
nVarB = &nVarA; // så peger nVarB på indholdet af nVarA, altså 10, ikke?

int nVarC = nVarB * (*nVarA);

jeg går ud fra der så skal paranteser om, for at compileren (og ikke mindst læseren) har en chance for at gætte hvad der er hvad?

virker det så? blir nVarC = 10*10 = 100 ?
Avatar billede arne_v Ekspert
24. januar 2004 - 21:23 #12
char *a = "ABC";
char b[] = "ABC"

prøv og ændre i a = fejl
prøv og ændre i b = virker fint

----

Ja - nVarB peger på nVarA

Det er ret almindelige at bruge (*navn) for at gøre det mere letlæseligt
Avatar billede bertelbrander Novice
25. januar 2004 - 00:07 #13
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).
Avatar billede mindplay Nybegynder
25. januar 2004 - 14:05 #14
"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...)
Avatar billede bertelbrander Novice
25. januar 2004 - 22:48 #15
C/C++ har (generelt) ingen range check.
Kompileren har ingen problemer med:

#include <stdio.h>

void Func(int Arr[1024])
{
  printf(">%d\n", sizeof(Arr));
}

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
Avatar billede mindplay Nybegynder
26. januar 2004 - 09:57 #16
okay, tak for hjælpen - tror jeg er ved at have styr på det nu...
Avatar billede arne_v Ekspert
26. januar 2004 - 13:14 #17
C er fra omkring 1970 og designet til at kunne lave bl.a. operativ systemer i.

C++ har valgt at være rimeligt "C kompatibel".

Det forudsætter lidt af programmøren. Du kan alt inkl. skyde dig selv i foden.
Avatar billede arne_v Ekspert
26. januar 2004 - 13:15 #18
C# er en kompiler (ligesom Java).

Men den kræver .NET installeret på maskinen der skal køre programmet.

Så vidt jeg har forstået Microsoft så bliver .NET native API og Win32 API
et kompabilitets API på et tidspunkt.
Avatar billede mindplay Nybegynder
26. januar 2004 - 13:26 #19
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?

det lyder rent ud sagt rablende sindssygt...
Avatar billede arne_v Ekspert
26. januar 2004 - 13:31 #20
C# kode kører glimrende hurtigt.

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.
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