Functies, Arrays en Twee Pointers
Functies met pointers
Laten we experimenteren met een eenvoudige functie om de waarde van onze data aan te passen. Stel bijvoorbeeld dat je een functie nodig hebt die kilo-Ohm naar Ohm converteert (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; }
Een poging om de waarde van de variabele r te wijzigen was niet succesvol. Dit komt doordat de functie een kopie ontvangt van de variabele r, niet de daadwerkelijke waarde zelf.
Om ons programma te laten werken zoals bedoeld, moet je het adres van de variabele r aan de functie doorgeven. Daardoor moet de functie Ohm double* accepteren in plaats van alleen 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; }
Let op dat de variabele r tweemaal wordt geraadpleegd. Na het aanroepen van de functie Ohm is de waarde van r gewijzigd. Dit komt doordat de functie het oorspronkelijke adres van de variabele r heeft ontvangen, en niet slechts een kopie, en vervolgens de waarde op dat specifieke adres heeft aangepast.
Daarnaast kan een functie een pointer retourneren naar een object dat door de functie is aangemaakt:
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; }
Wanneer een getal (pX + 1) bij een adres wordt opgeteld, levert dit het adres van de volgende geheugencel op! Stel een lus op om door de "reeks" van het RAM-geheugen te navigeren:
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; }
Je hebt drie stappen vooruit geprojecteerd. Uit de afgeleide adressen blijkt duidelijk dat er een duidelijke hiërarchie is.
Een array is in wezen een vast adres (weergegeven door de naam van de array) gekoppeld aan toegewezen geheugen. De indexen van de elementen geven hun offset ten opzichte van het adres van het eerste element aan!
Dit concept kan worden bevestigd met het volgende programma:
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; }
Je doorloopt de array niet direct. Je gebruikt uitsluitend het adres ervan, met name het adres van het eerste element.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.63
Functies, Arrays en Twee Pointers
Veeg om het menu te tonen
Functies met pointers
Laten we experimenteren met een eenvoudige functie om de waarde van onze data aan te passen. Stel bijvoorbeeld dat je een functie nodig hebt die kilo-Ohm naar Ohm converteert (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; }
Een poging om de waarde van de variabele r te wijzigen was niet succesvol. Dit komt doordat de functie een kopie ontvangt van de variabele r, niet de daadwerkelijke waarde zelf.
Om ons programma te laten werken zoals bedoeld, moet je het adres van de variabele r aan de functie doorgeven. Daardoor moet de functie Ohm double* accepteren in plaats van alleen 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; }
Let op dat de variabele r tweemaal wordt geraadpleegd. Na het aanroepen van de functie Ohm is de waarde van r gewijzigd. Dit komt doordat de functie het oorspronkelijke adres van de variabele r heeft ontvangen, en niet slechts een kopie, en vervolgens de waarde op dat specifieke adres heeft aangepast.
Daarnaast kan een functie een pointer retourneren naar een object dat door de functie is aangemaakt:
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; }
Wanneer een getal (pX + 1) bij een adres wordt opgeteld, levert dit het adres van de volgende geheugencel op! Stel een lus op om door de "reeks" van het RAM-geheugen te navigeren:
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; }
Je hebt drie stappen vooruit geprojecteerd. Uit de afgeleide adressen blijkt duidelijk dat er een duidelijke hiërarchie is.
Een array is in wezen een vast adres (weergegeven door de naam van de array) gekoppeld aan toegewezen geheugen. De indexen van de elementen geven hun offset ten opzichte van het adres van het eerste element aan!
Dit concept kan worden bevestigd met het volgende programma:
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; }
Je doorloopt de array niet direct. Je gebruikt uitsluitend het adres ervan, met name het adres van het eerste element.
Bedankt voor je feedback!