Ich glaube, Sie sind Vertauschen und Benennung Funktionszeiger definieren. Ich werde Sie brauchen nur darauf hin, dass, wenn Sie
schreiben
void func0(void) { printf("0\n"); }
void (*func0)(void);
Sie haben tatsächlich zwei völlig unabhängige Objekte mit dem gleichen Namen func0
. Die erste func0
ist eine Funktion, die zweite func0
ist eine Variable mit Typ Zeiger-zur-Funktion.
Angenommen, Sie erklärt Ihre Variablefunc0
global (außerhalb jeder Funktion), wird es automatisch Null initialisiert werden, so wird der Compiler Ihre Linie
void (*func0)(void);
als
void (*func0)(void) = NULL;
So lesen Die Variable func0
wird mit dem Wert NULL
initialisiert, und auf den meisten Systemen wird NULL
tatsächlich 0
sein.
Ihr Debugger jetzt sagt Ihnen, dass Ihr Variablefunc0
den Wert 0x0000
hat, die 0
ist. Das ist wirklich keine große Überraschung.
Um Ihre Frage zu einem „fix“ - na ja, ich nehme an, Sie einen Funktionszeiger wollen, der auf Ihre Funktion func0
, so können Sie Folgendes tun können:
void func0(void) { printf("0\n"); }
void (*pFunc)(void) = func0;
oder noch besser (wenn auch auf den meisten Compiler nicht erforderlich) können Sie schreiben
void (*pFunc)(void) = &func0;
so initialisieren Sie Ihre Variable pFunc
(ich empfehle die Umbenennung es sehr!) zu func0
zeigen. Ein bisschen genauer: Sie nehmen die Adresse &...
der Funktion func0
und weisen diesen Wert Ihrer Variablen pFunc
zu.
Jetzt können Sie „Anruf“ den Funktionszeiger (das heißt, um die Funktion aufzurufen, die die Funktion Zeiger auf) von:
pFunc(); //will call function func0
Die erste Linie definiert einen Funktionszeiger, ohne Initialisierung, wobei die zweite Leitung definiert eine Funktion, die zufällig denselben Namen hat. – wildplasser