Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Funktioner, Arrays og To Pointers | Pointere
C-Grundlæggende

bookFunktioner, Arrays og To Pointers

Funktioner med pegere

Lad os eksperimentere med en grundlæggende funktion til at ændre værdien af vores data. Forestil dig for eksempel, at du har brug for en funktion, der konverterer kilo-Ohm til Ohm (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Et forsøg på at ændre værdien af variablen r var ikke succesfuldt. Dette skyldes, at funktionen modtager en kopi af variablen r, ikke selve værdien.

For at få programmet til at fungere som ønsket, skal du videregive adressen på variablen r til funktionen. Derfor skal funktionen Ohm acceptere double* i stedet for blot double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Bemærk, at du refererer til variablen r to gange. Efter kaldet til funktionen Ohm er værdien af r ændret. Dette skyldes, at funktionen modtog den oprindelige adresse på variablen r, ikke blot en kopi, og derefter ændrede værdien på denne specifikke adresse.

Desuden kan en funktion returnere en pointer til et objekt, som den har oprettet:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Når et tal (pX + 1) lægges til en adresse, giver det adressen på den efterfølgende hukommelsescelle! Lad os skrive en løkke for at navigere gennem RAM-"sekvensen":

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Du har forudset tre skridt frem. Det fremgår tydeligt af de afledte adresser, at der er en klar hierarki.

Et array er i bund og grund en fast adresse (repræsenteret ved arrayets navn) kombineret med allokeret hukommelse. Elementernes indekser angiver deres offset fra adressen på det første element!

Denne opfattelse kan bekræftes med følgende program:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Du gennemløber ikke direkte arrayet. Du benytter udelukkende dets adresse, specifikt adressen på det første element.

question mark

Hvilken erklæring forklarer bedst, hvorfor en funktion i C kan ændre værdien af en variabel, når der videregives en pointer til den, men ikke når selve variablen videregives?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 6. Kapitel 5

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

Can you explain how passing by address works in more detail?

What are some common mistakes when using pointers in functions?

Can you show an example of pointer arithmetic in a loop?

Awesome!

Completion rate improved to 2.63

bookFunktioner, Arrays og To Pointers

Stryg for at vise menuen

Funktioner med pegere

Lad os eksperimentere med en grundlæggende funktion til at ændre værdien af vores data. Forestil dig for eksempel, at du har brug for en funktion, der konverterer kilo-Ohm til Ohm (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Et forsøg på at ændre værdien af variablen r var ikke succesfuldt. Dette skyldes, at funktionen modtager en kopi af variablen r, ikke selve værdien.

For at få programmet til at fungere som ønsket, skal du videregive adressen på variablen r til funktionen. Derfor skal funktionen Ohm acceptere double* i stedet for blot double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Bemærk, at du refererer til variablen r to gange. Efter kaldet til funktionen Ohm er værdien af r ændret. Dette skyldes, at funktionen modtog den oprindelige adresse på variablen r, ikke blot en kopi, og derefter ændrede værdien på denne specifikke adresse.

Desuden kan en funktion returnere en pointer til et objekt, som den har oprettet:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Når et tal (pX + 1) lægges til en adresse, giver det adressen på den efterfølgende hukommelsescelle! Lad os skrive en løkke for at navigere gennem RAM-"sekvensen":

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Du har forudset tre skridt frem. Det fremgår tydeligt af de afledte adresser, at der er en klar hierarki.

Et array er i bund og grund en fast adresse (repræsenteret ved arrayets navn) kombineret med allokeret hukommelse. Elementernes indekser angiver deres offset fra adressen på det første element!

Denne opfattelse kan bekræftes med følgende program:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Du gennemløber ikke direkte arrayet. Du benytter udelukkende dets adresse, specifikt adressen på det første element.

question mark

Hvilken erklæring forklarer bedst, hvorfor en funktion i C kan ændre værdien af en variabel, når der videregives en pointer til den, men ikke når selve variablen videregives?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 6. Kapitel 5
some-alt