C Academy · Oppitunti

Funktio-osoittimien määrittely

Osoittimet funktioihin.

Oppitunti 1/413 vaihetta

Funktio-osoittimien määrittely on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Funktioilla on osoitteet

Kuten data, jokainen funktio sijaitsee muistissa tietyssä osoitteessa. Funktio-osoitin tallentaa tämän osoitteen, joten funktion voi kutsua epäsuorasti.

#include <stdio.h>

void greet(void) { printf("hello\n"); }

int main(void) {
    void (*fp)(void) = greet;
    fp();
    return 0;
}

Määrityksen lukeminen

Määritys int (*fp)(int) tarkoittaa, että fp on osoitin funktioon, joka ottaa parametriksi int-arvon ja palauttaa int-arvon.

*fp:n ympärillä olevat sulkeet ovat pakolliset.

#include <stdio.h>

int square(int x) { return x * x; }

int main(void) {
    int (*fp)(int) = square;
    printf("%d\n", fp(5));
    return 0;
}

Funktion sijoittaminen

Funktion nimi muuttuu automaattisesti sen osoitteeksi, joten fp = square ja fp = &square vastaavat toisiaan.

#include <stdio.h>

int dbl(int x) { return x * 2; }

int main(void) {
    int (*fp)(int);
    fp = &dbl;
    printf("%d\n", fp(7));
    return 0;
}

Kutsuminen osoittimen kautta

Funktio-osoittimen kautta voi kutsua funktiota muodossa fp(args) tai eksplisiittisesti muodossa (*fp)(args). Molemmat toimivat samalla tavalla.

#include <stdio.h>

int add1(int x) { return x + 1; }

int main(void) {
    int (*fp)(int) = add1;
    printf("%d\n", fp(10));
    printf("%d\n", (*fp)(10));
    return 0;
}

Allekirjoitusten on täsmättävä

Funktio-osoittimen tyyppiin kuuluvat paluuarvon tyyppi ja parametrien tyypit. Sille voi sijoittaa vain funktion, jonka allekirjoitus täsmää täsmälleen.

#include <stdio.h>

double half(double x) { return x / 2.0; }

int main(void) {
    double (*fp)(double) = half;
    printf("%f\n", fp(9.0));
    return 0;
}

Uudelleenosoittaminen ajon aikana

Funktio-osoitin on muuttuja, joten sen voi ohjelman suorituksen aikana kohdistaa eri funktioihin.

#include <stdio.h>

int inc(int x) { return x + 1; }
int dec(int x) { return x - 1; }

int main(void) {
    int (*op)(int) = inc;
    printf("%d\n", op(5));
    op = dec;
    printf("%d\n", op(5));
    return 0;
}

Valitseminen ehdon perusteella

Valitkaa kutsuttava funktio ajonaikaisen arvon perusteella ja kutsukaa sitä yhden osoittimen kautta.

#include <stdio.h>

int plus(int a) { return a + 10; }
int minus(int a) { return a - 10; }

int main(void) {
    int up = 1;
    int (*op)(int) = up ? plus : minus;
    printf("%d\n", op(100));
    return 0;
}

typedef selkeyttää lukemista

Funktio-osoittimen syntaksi on pitkä. typedef antaa tyypille nimen ja tekee määrityksistä selkeämpiä.

#include <stdio.h>

typedef int (*IntOp)(int);

int triple(int x) { return x * 3; }

int main(void) {
    IntOp op = triple;
    printf("%d\n", op(4));
    return 0;
}

Kahden parametrin funktiot

Funktio-osoittimilla voi kuvata minkä tahansa allekirjoituksen. Tässä on osoitin kahden kokonaisluvun operaatiolle.

#include <stdio.h>

int sum(int a, int b) { return a + b; }

int main(void) {
    int (*op)(int, int) = sum;
    printf("%d\n", op(3, 4));
    return 0;
}

NULL-funktio-osoitin

Kuten dataosoitin, myös funktio-osoitin voi olla NULL. Tarkistakaa aina ennen kutsua, ettei mahdollisesti asettamatta jäänyt osoitin ole tyhjä.

#include <stdio.h>

int twice(int x) { return x * 2; }

int main(void) {
    int (*op)(int) = NULL;
    if (op == NULL) op = twice;
    if (op) printf("%d\n", op(8));
    return 0;
}

Osoitteen tulostaminen

Tallennetun osoitteen voi tarkistaa. Eri funktioilla on eri osoitteet.

#include <stdio.h>

int f(int x) { return x; }

int main(void) {
    int (*fp)(int) = f;
    printf("function pointer is %s\n", fp ? "set" : "null");
    return 0;
}

Pikatesti

Testatkaa ymmärrystänne funktio-osoittimien määrityksistä.

Kertaus

Opitte määrittämään ja käyttämään funktio-osoittimia:

  • Syntaksi: ret (*name)(params), jossa sulkeet ovat pakolliset.
  • Sijoittakaa osoittimeen funktion nimi, joka muuttuu automaattisesti osoitteeksi.
  • Kutsukaa muodossa fp(args) tai (*fp)(args).
  • Allekirjoituksen on täsmättävä; typedef parantaa luettavuutta.
Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”Funktio-osoittimien määrittely” ilmainen?

Kyllä – oppitunnin ”Funktio-osoittimien määrittely” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Funktio-osoittimien määrittely”?

Osoittimet funktioihin. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Funktio-osoittimien määrittely”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktio-osoittimien määrittely
  2. Funktioiden välittäminen
  3. qsort vertailufunktioilla
  4. Funktio-osoitintaulukot
← Takaisin: C Academy