C Academy · Lektion

Deklarering af funktionspointere

Pointere til funktioner

Lektion 1 af 413 trin

Deklarering af funktionspointere er en gratis C Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C Academy-kurset indeholder 4 lektioner i alt.

Funktioner har adresser

Ligesom data befinder enhver funktion sig på en adresse i hukommelsen. En funktionspointer gemmer denne adresse, så du kan kalde funktionen indirekte.

#include <stdio.h>

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

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

Læsning af erklæringen

Erklæringen int (*fp)(int) betyder: fp er en pointer til en funktion, der modtager en int og returnerer en int.

Parenteserne omkring *fp er nødvendige.

#include <stdio.h>

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

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

Tildeling af en funktion

Et funktionsnavn omdannes til sin adresse, så fp = square og fp = &square er ækvivalente.

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

Kald gennem pointeren

Du kan kalde gennem en funktionspointer med fp(args) eller den eksplicitte form (*fp)(args). Begge gø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 skal passe

Typen for en funktionspointer omfatter dens returtype og parametertyper. Du kan kun tildele en funktion, hvis signatur passer nøjagtigt.

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

Gentildeling under kørsel

En funktionspointer er en variabel, så du kan lade den pege på forskellige funktioner, mens programmet kø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;
}

Valg ud fra en betingelse

Vælg, hvilken funktion der skal kaldes, baseret på en værdi under kørsel, og kald den derefter gennem én pointer.

#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 læsbarhed

Syntaksen for funktionspointere er omstændelig. En typedef giver typen et navn, så erklæringerne bliver 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;
}

Funktioner med to argumenter

Funktionspointere kan beskrive enhver signatur. Her er en til en binær heltalsoperation.

#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-funktionspointer

Ligesom datapointere kan en funktionspointer være NULL. Kontrollér altid pointeren, før du kalder en, der muligvis ikke er sat.

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

Udskrivning af adressen

Du kan undersøge den gemte adresse. Forskellige funktioner har forskellige 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;
}

Hurtigt tjek

Test din forståelse af erklæringer for funktionspointere.

Opsummering

Du har lært at erklære og bruge funktionspointere:

  • Syntaks: ret (*name)(params) med nødvendige parenteser.
  • Tildel med funktionsnavnet (det omdannes til en adresse).
  • Kald med fp(args) eller (*fp)(args).
  • Signaturen skal passe; typedef forbedrer læsbarheden.
Gratis at komme i gang

Lær C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
39
Lektioner
144

Ofte stillede spørgsmål

Er lektionen “Deklarering af funktionspointere” gratis?

Ja — hele teksten til “Deklarering af funktionspointere” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C Academy-kurset, skal du opgradere til CoddyKit PRO. C Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Deklarering af funktionspointere”?

Pointere til funktioner Du øver dig i C Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C Academy?

Der kræves ingen tidligere erfaring. C Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Deklarering af funktionspointere”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C Academy-lektion?

Ja. Alle C Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Deklarering af funktionspointere
  2. Videregivelse af funktioner
  3. qsort med sammenligningsfunktioner
  4. Tabeller med funktionspointere
← Tilbage til C Academy