C Academy · Lektion

Deklarera funktionspekare

Pekare till funktioner.

Lektion 1 av 413 steg

Deklarera funktionspekare är en gratis lektion i C Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C Academy innehåller totalt 4 lektioner.

Funktioner har adresser

Precis som data finns varje funktion på en adress i minnet. En funktionspekare lagrar den adressen så att Ni kan anropa funktionen indirekt.

#include <stdio.h>

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

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

Läsa deklarationen

Deklarationen int (*fp)(int) betyder: fp är en pekare till en funktion som tar en int och returnerar en int.

Parenteserna runt *fp krävs.

#include <stdio.h>

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

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

Tilldela en funktion

Ett funktionsnamn omvandlas till sin adress, så fp = square och fp = &square är likvärdiga.

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

Anropa via pekaren

Ni kan anropa via en funktionspekare med fp(args) eller den explicita formen (*fp)(args). Båda gör samma sak.

#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åste stämma

En funktionspekares typ innehåller returtypen och parametertyperna. Ni kan endast tilldela en funktion vars signatur matchar exakt.

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

Tilldela om under körning

En funktionspekare är en variabel, så Ni kan låta den peka på olika funktioner medan programmet körs.

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

Välja utifrån ett villkor

Välj vilken funktion som ska anropas utifrån ett värde under körning och anropa den sedan via en pekare.

#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 för bättre läsbarhet

Syntaxen för funktionspekare är omständlig. Med typedef får typen ett namn, vilket gör deklarationerna tydligare.

#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 två argument

Funktionspekare kan beskriva vilken signatur som helst. Här är en för 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-funktionspekare

Precis som datapekare kan en funktionspekare vara NULL. Kontrollera alltid innan Ni anropar en som kanske inte har satts.

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

Skriva ut adressen

Ni kan granska den lagrade adressen. Olika funktioner har olika 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;
}

Snabbtest

Testa Er förståelse av deklarationer av funktionspekare.

Sammanfattning

Ni har lärt Er att deklarera och använda funktionspekare:

  • Syntax: ret (*name)(params) med obligatoriska parenteser.
  • Tilldela med funktionsnamnet (det omvandlas till en adress).
  • Anropa med fp(args) eller (*fp)(args).
  • Signaturen måste stämma; typedef förbättrar läsbarheten.
Gratis att börja

Lär dig C med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
144

Vanliga frågor

Är lektionen ”Deklarera funktionspekare” gratis?

Ja – hela texten till ”Deklarera funktionspekare” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Deklarera funktionspekare”?

Pekare till funktioner. Ni övar på C Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C Academy?

Du behöver inga förkunskaper. Utbildningen i C Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Deklarera funktionspekare”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C Academy-lektionen?

Ja. Varje C Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Deklarera funktionspekare
  2. Skicka funktioner
  3. qsort med jämförelsefunktioner
  4. Tabeller med funktionspekare
← Tillbaka till C Academy