fun_ptr is a pointer that can point to a function with the given signature. The way you have it, not only does it have the wrong signature, but it doesn't even point to anything since you haven't assigned anything to it. You need to assign a function to it.
Code:
#include <stdio.h>
#include <stdint.h>
 
void write_chars(uint8_t row, uint8_t col, char *str) {
    printf("%d %d %s\n", (int)row, (int)col, str);
}
 
int main() {
    void (*fp)(uint8_t, uint8_t, char*);
    fp = write_chars;
    fp(1, 1, "message1");
    return 0;
}
typedefs are used to create aliases for types.
Code:
typedef int MYINT;
// now you can say:
MYINT i, j, k;
enums and structs need the keyword enum or struct, respectively, in front of them when they are used:
Code:
// Suppose we have this enum and struct:
 
enum AnEnum { Zero, One, Two, Three };
 
struct AStruct {
    int a, b;
};
 
// Then we can define variables of these types like so:
enum AnEnum e = Two;   // we need to say "enum" first
struct AStruct s;      // we need to say "struct" first
If you don't want to have to say "enum" or "struct" in front of these, you can use a typedef:
Code:
// Note that we can use the same name (or a different name) for the typedef
typedef enum AnEnum AnEnum;         // using the same name
typedef struct AStruct MyStruct;    // using a different name
 
// Now we can just say
AnEnum e = Two;
MyStruct s;