Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Functies, Arrays en Twee Pointers | Pointers
C-Basis

bookFuncties, 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

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; }

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

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; }

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

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; }

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

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; }

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

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; }

Je doorloopt de array niet direct. Je gebruikt uitsluitend het adres ervan, met name het adres van het eerste element.

question mark

Welke uitspraak verklaart het beste waarom een functie in C de waarde van een variabele kan wijzigen wanneer een pointer naar die variabele wordt doorgegeven, maar niet wanneer de variabele zelf wordt doorgegeven?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 6. Hoofdstuk 5

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 2.63

bookFuncties, 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

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; }

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

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; }

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

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; }

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

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; }

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

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; }

Je doorloopt de array niet direct. Je gebruikt uitsluitend het adres ervan, met name het adres van het eerste element.

question mark

Welke uitspraak verklaart het beste waarom een functie in C de waarde van een variabele kan wijzigen wanneer een pointer naar die variabele wordt doorgegeven, maar niet wanneer de variabele zelf wordt doorgegeven?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 6. Hoofdstuk 5
some-alt