Deklarering af funktionspointere
Pointere til funktioner
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;
typedefforbedrer læsbarheden.
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
- Deklarering af funktionspointere
- Videregivelse af funktioner
- qsort med sammenligningsfunktioner
- Tabeller med funktionspointere