Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Funksjoner, Matriser og To Pekere | Pekere
C-Grunnleggende

bookFunksjoner, Matriser og To Pekere

Funksjoner med pekere

La oss eksperimentere med en grunnleggende funksjon for å endre verdien til dataene våre. For eksempel, tenk deg at du trenger en funksjon som 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øk på å endre verdien til variabelen r var mislykket. Dette er fordi funksjonen mottar en kopi av variabelen r, ikke selve verdien.

For at programmet vårt skal fungere som ønsket, må du sende adressen til variabelen r til funksjonen. Som et resultat bør Ohm-funksjonen akseptere double* i stedet for bare 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; }

Merk at du refererer til variabelen r to ganger. Etter at funksjonen Ohm er kalt, er verdien til r endret. Dette skjer fordi funksjonen mottok den opprinnelige adressen til variabelen r, ikke bare en kopi, og deretter endret verdien på denne adressen.

Videre kan en funksjon returnere en peker til et objekt den har opprettet:

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 tall (pX + 1) legges til en adresse, gir det adressen til den neste minnecellen! La oss lage en løkke for å navigere gjennom "sekvensen" av RAM:

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 sett tre steg fremover. Det er tydelig fra de utledede adressene at det finnes en klar hierarki.

Et array er i hovedsak en fast adresse (representert ved arrayets navn) sammen med allokert minne. Indeksene til elementene representerer deres forskyvning fra adressen til det første elementet!

Dette kan bekreftes 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 traverserer ikke direkte gjennom arrayet. Du bruker kun adressen, nærmere bestemt adressen til det første elementet.

question mark

Hvilken påstand forklarer best hvorfor en funksjon i C kan endre verdien til en variabel når den får en peker til den, men ikke når den får selve variabelen?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 6. Kapittel 5

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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

bookFunksjoner, Matriser og To Pekere

Sveip for å vise menyen

Funksjoner med pekere

La oss eksperimentere med en grunnleggende funksjon for å endre verdien til dataene våre. For eksempel, tenk deg at du trenger en funksjon som 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øk på å endre verdien til variabelen r var mislykket. Dette er fordi funksjonen mottar en kopi av variabelen r, ikke selve verdien.

For at programmet vårt skal fungere som ønsket, må du sende adressen til variabelen r til funksjonen. Som et resultat bør Ohm-funksjonen akseptere double* i stedet for bare 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; }

Merk at du refererer til variabelen r to ganger. Etter at funksjonen Ohm er kalt, er verdien til r endret. Dette skjer fordi funksjonen mottok den opprinnelige adressen til variabelen r, ikke bare en kopi, og deretter endret verdien på denne adressen.

Videre kan en funksjon returnere en peker til et objekt den har opprettet:

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 tall (pX + 1) legges til en adresse, gir det adressen til den neste minnecellen! La oss lage en løkke for å navigere gjennom "sekvensen" av RAM:

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 sett tre steg fremover. Det er tydelig fra de utledede adressene at det finnes en klar hierarki.

Et array er i hovedsak en fast adresse (representert ved arrayets navn) sammen med allokert minne. Indeksene til elementene representerer deres forskyvning fra adressen til det første elementet!

Dette kan bekreftes 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 traverserer ikke direkte gjennom arrayet. Du bruker kun adressen, nærmere bestemt adressen til det første elementet.

question mark

Hvilken påstand forklarer best hvorfor en funksjon i C kan endre verdien til en variabel når den får en peker til den, men ikke når den får selve variabelen?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 6. Kapittel 5
some-alt