Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Funktioner, Arrayer och Två Pekare | Pekare
C-Grunder

bookFunktioner, Arrayer och Två Pekare

Funktioner med pekare

Låt oss experimentera med en grundläggande funktion för att ändra värdet på våra data. Tänk dig till exempel att du behöver en funktion som omvandlar kilo-Ohm till 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; }

Ett försök att ändra värdet på variabeln r misslyckades. Detta beror på att funktionen tar emot en kopia av variabeln r, inte själva värdet.

För att få programmet att fungera som avsett behöver du skicka adressen till variabeln r till funktionen. Därför ska funktionen Ohm ta emot double* istället för bara 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; }

Observera att du refererar till variabeln r två gånger. Efter att ha anropat funktionen Ohm har värdet på r ändrats. Detta beror på att funktionen tog emot den ursprungliga adressen till variabeln r, inte bara en kopia, och sedan ändrade värdet på just den adressen.

Dessutom kan en funktion returnera en pekare till ett objekt som den har skapat:

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 ett tal (pX + 1) adderas till en adress, ger det adressen till nästa minnescell! Låt oss skriva en loop för att navigera genom RAM-minnets "sekvens":

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 förutsett tre steg framåt. Det framgår av de härledda adresserna att det finns en tydlig hierarki.

En array är i grunden en fast adress (representerad av arrayens namn) tillsammans med allokerat minne. Elementens index representerar deras avstånd från adressen till det första elementet!

Denna uppfattning kan bekräftas med följande 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 traverserar inte direkt genom arrayen. Du använder enbart dess adress, specifikt adressen till dess första element.

question mark

Vilket påstående förklarar bäst varför en funktion i C kan ändra värdet på en variabel när en pekare till den skickas, men inte när variabeln själv skickas

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 6. Kapitel 5

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

bookFunktioner, Arrayer och Två Pekare

Svep för att visa menyn

Funktioner med pekare

Låt oss experimentera med en grundläggande funktion för att ändra värdet på våra data. Tänk dig till exempel att du behöver en funktion som omvandlar kilo-Ohm till 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; }

Ett försök att ändra värdet på variabeln r misslyckades. Detta beror på att funktionen tar emot en kopia av variabeln r, inte själva värdet.

För att få programmet att fungera som avsett behöver du skicka adressen till variabeln r till funktionen. Därför ska funktionen Ohm ta emot double* istället för bara 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; }

Observera att du refererar till variabeln r två gånger. Efter att ha anropat funktionen Ohm har värdet på r ändrats. Detta beror på att funktionen tog emot den ursprungliga adressen till variabeln r, inte bara en kopia, och sedan ändrade värdet på just den adressen.

Dessutom kan en funktion returnera en pekare till ett objekt som den har skapat:

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 ett tal (pX + 1) adderas till en adress, ger det adressen till nästa minnescell! Låt oss skriva en loop för att navigera genom RAM-minnets "sekvens":

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 förutsett tre steg framåt. Det framgår av de härledda adresserna att det finns en tydlig hierarki.

En array är i grunden en fast adress (representerad av arrayens namn) tillsammans med allokerat minne. Elementens index representerar deras avstånd från adressen till det första elementet!

Denna uppfattning kan bekräftas med följande 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 traverserar inte direkt genom arrayen. Du använder enbart dess adress, specifikt adressen till dess första element.

question mark

Vilket påstående förklarar bäst varför en funktion i C kan ändra värdet på en variabel när en pekare till den skickas, men inte när variabeln själv skickas

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 6. Kapitel 5
some-alt