C Academy · leksjon

Deklarere funksjonspekere

Pekere til funksjoner

Leksjon 1 av 413 trinn

Deklarere funksjonspekere er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.

Funksjoner har adresser

Akkurat som data ligger hver funksjon på en adresse i minnet. En funksjonspeker lagrer denne adressen, slik at De kan kalle funksjonen indirekte.

#include <stdio.h>

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

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

Lese deklarasjonen

Deklarasjonen int (*fp)(int) betyr: fp er en peker til en funksjon som tar en int og returnerer en int.

Parentesene rundt *fp er obligatoriske.

#include <stdio.h>

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

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

Tilordne en funksjon

Et funksjonsnavn konverteres til adressen sin, så fp = square og fp = &square er ekvivalente.

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

Kalle gjennom pekeren

De kan kalle gjennom en funksjonspeker med fp(args) eller den eksplisitte formen (*fp)(args). Begge gjør det samme.

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

Signaturen må samsvare

Typen til en funksjonspeker omfatter returtypen og parametertypene. De kan bare tilordne en funksjon med en signatur som samsvarer nøyaktig.

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

Tilordne på nytt under kjøring

En funksjonspeker er en variabel, så De kan la den peke på forskjellige funksjoner mens programmet kjører.

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

Velge basert på en betingelse

Velg hvilken funksjon som skal kalles, basert på en verdi under kjøring, og kall den deretter gjennom én peker.

#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 for bedre lesbarhet

Syntaksen for funksjonspekere er omstendelig. En typedef gir typen et navn, slik at deklarasjonene blir tydeligere.

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

Funksjoner med to argumenter

Funksjonspekere kan beskrive enhver signatur. Her er et eksempel på en funksjon for en binær heltallsoperasjon.

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

En NULL-funksjonspeker

Akkurat som datatypens pekere kan en funksjonspeker være NULL. Kontroller alltid før De kaller en peker som kanskje ikke er satt.

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

Skrive ut adressen

De kan undersøke den lagrede adressen. Forskjellige funksjoner har forskjellige adresser.

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

Rask kontroll

Test forståelsen Deres av deklarasjoner av funksjonspekere.

Oppsummering

De har lært å deklarere og bruke funksjonspekere:

  • Syntaks: ret (*name)(params) med obligatoriske parenteser.
  • Tilordne med funksjonsnavnet (det konverteres til en adresse).
  • Kall med fp(args) eller (*fp)(args).
  • Signaturen må samsvare. typedef gjør koden mer lesbar.
Gratis å komme i gang

Lær deg C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
39
Leksjoner
144

Ofte stilte spørsmål

Er leksjonen «Deklarere funksjonspekere» gratis?

Ja – hele teksten i «Deklarere funksjonspekere» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Deklarere funksjonspekere»?

Pekere til funksjoner Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C Academy?

Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Deklarere funksjonspekere»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?

Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Deklarere funksjonspekere
  2. Sende funksjoner
  3. qsort med sammenligningsfunksjoner
  4. Tabeller med funksjonspekere
← Tilbake til C Academy