Funksjoner, 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
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
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
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
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
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.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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
Funksjoner, 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
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
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
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
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
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.
Takk for tilbakemeldingene dine!