Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Funktiot, Taulukot ja Kaksi Osoitinta | Osoittimet
C:n Perusteet

bookFunktiot, Taulukot ja Kaksi Osoitinta

Funktiot osoittimilla

Kokeillaan perustoimintoa, jolla voidaan muuttaa tietomme arvoa. Kuvitellaan esimerkiksi, että tarvitset funktion, joka muuntaa kilo-ohmit ohmeiksi (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; }

Yritys muuttaa r-muuttujan arvoa epäonnistui. Tämä johtuu siitä, että funktio vastaanottaa kopion r-muuttujasta, ei itse arvoa.

Jotta ohjelma toimisi halutulla tavalla, sinun täytyy välittää funktion parametrina osoite r-muuttujasta. Tämän seurauksena Ohm-funktion tulee ottaa vastaan double* pelkän double:n sijaan.

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

Huomaa, että viittaat muuttujaan r kahdesti. Kun Ohm-funktiota kutsutaan, muuttujan r arvo muuttuu. Tämä johtuu siitä, että funktio vastaanotti muuttujan r alkuperäisen osoitteen, ei pelkkää kopiota, ja muutti sitten kyseisessä osoitteessa olevaa arvoa.

Lisäksi funktio voi palauttaa osoittimen olioon, jonka se on luonut:

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

Kun osoitteeseen lisätään luku (pX + 1), saadaan seuraavan muistisolun osoite! Kirjoitetaan silmukka, joka kulkee RAM-muistin "jonon" läpi:

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

Olet tarkastellut kolmea askelta eteenpäin. Johdetuista osoitteista käy ilmi selkeä hierarkia.

Taulukko on pohjimmiltaan kiinteä osoite (jonka taulukon nimi edustaa) sekä varattu muistialue. Alkioiden indeksit kuvaavat niiden etäisyyttä ensimmäisen alkion osoitteesta!

Tämän käsitteen voi todentaa seuraavalla ohjelmalla:

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

Taulukkoa ei käydä läpi suoraan. Käytetään ainoastaan sen osoitetta, tarkemmin sanottuna ensimmäisen alkion osoitetta.

question mark

Mikä väite parhaiten selittää, miksi C-kielessä funktio voi muuttaa muuttujan arvoa, kun sille välitetään osoitin muuttujaan, mutta ei silloin kun muuttuja välitetään sellaisenaan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 6. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 2.63

bookFunktiot, Taulukot ja Kaksi Osoitinta

Pyyhkäise näyttääksesi valikon

Funktiot osoittimilla

Kokeillaan perustoimintoa, jolla voidaan muuttaa tietomme arvoa. Kuvitellaan esimerkiksi, että tarvitset funktion, joka muuntaa kilo-ohmit ohmeiksi (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; }

Yritys muuttaa r-muuttujan arvoa epäonnistui. Tämä johtuu siitä, että funktio vastaanottaa kopion r-muuttujasta, ei itse arvoa.

Jotta ohjelma toimisi halutulla tavalla, sinun täytyy välittää funktion parametrina osoite r-muuttujasta. Tämän seurauksena Ohm-funktion tulee ottaa vastaan double* pelkän double:n sijaan.

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

Huomaa, että viittaat muuttujaan r kahdesti. Kun Ohm-funktiota kutsutaan, muuttujan r arvo muuttuu. Tämä johtuu siitä, että funktio vastaanotti muuttujan r alkuperäisen osoitteen, ei pelkkää kopiota, ja muutti sitten kyseisessä osoitteessa olevaa arvoa.

Lisäksi funktio voi palauttaa osoittimen olioon, jonka se on luonut:

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

Kun osoitteeseen lisätään luku (pX + 1), saadaan seuraavan muistisolun osoite! Kirjoitetaan silmukka, joka kulkee RAM-muistin "jonon" läpi:

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

Olet tarkastellut kolmea askelta eteenpäin. Johdetuista osoitteista käy ilmi selkeä hierarkia.

Taulukko on pohjimmiltaan kiinteä osoite (jonka taulukon nimi edustaa) sekä varattu muistialue. Alkioiden indeksit kuvaavat niiden etäisyyttä ensimmäisen alkion osoitteesta!

Tämän käsitteen voi todentaa seuraavalla ohjelmalla:

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

Taulukkoa ei käydä läpi suoraan. Käytetään ainoastaan sen osoitetta, tarkemmin sanottuna ensimmäisen alkion osoitetta.

question mark

Mikä väite parhaiten selittää, miksi C-kielessä funktio voi muuttaa muuttujan arvoa, kun sille välitetään osoitin muuttujaan, mutta ei silloin kun muuttuja välitetään sellaisenaan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 6. Luku 5
some-alt