Funktioner, 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
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
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
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
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
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.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
Funktioner, 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
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
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
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
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
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.
Tak for dine kommentarer!