Funktiot, 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
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
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
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
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
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.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.63
Funktiot, 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
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
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
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
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
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.
Kiitos palautteestasi!