1.包含指针的用法
#include <stdio.h> typedef char* PCHAR; int main() { PCHAR first_name = "first name"; PCHAR last_name = "last name"; printf("--%s-- \n",first_name); printf("--%s-- \n",last_name); }
2.包含结构体的用法
typedef struct Student { int age; int id; char* name; }STU; STU student;
或者:
struct Student { int age; int id; char* name; }; typedef struct Student student;
3.下面分析几个例子
3.1 有这样一个: char * (*f[5]) (int,char*);
原则:左右法则,看括号
我们可以看出,主要是由2个括号组成的。第一个括号里是*f[5],第二个括号里是 int,char*。最前面还有一个char*.
---> 在*f[5]中,由于[]的优先级高于*,所以,他是一个数组,且是一个指针数组。加上外面的括号,我们可以得出,他是一个函数指针数组。
----> 那么,(int ,char*)就是每个函数的参数。
上面我们提到 【每个函数 】,因为函数指针数组里,每个元素都指向一个函数,对我们的声明来说,有5个参数是(int ,char*)的函数。
那么char* 就是他们的返回值。
所以我们知道,要重新起名的,是函数指针数组的名字,就是那个f。
所以我们用typedef来声明它的时候,需要这样作就好了:
typedef char* (*array_func[5])(int a,char* b); //因为是声明,所以参数里的a,b不填也是可以的。 array_func functions; //那么functions就有5个元素
当然,这是大家在网上都能看见的,但是这样是唯一的吗?答案是否的。
你可以
typedef char* (*array_func)(int a,char* b);
那么声明变量的时候,你就用
array_func functions[5];
效果是一样的,灵活对待。来看一下具体的应用。
#include <stdio.h> //char *(*real_func[5])(int,char*); char* get_info(int id,char* name); typedef char* (*array_func[5])(int a,char* b); array_func func; int main() { func[0] = get_info; printf("--%s--",func[0](1,"your name")); } char* get_info(int id,char* name) { return name; }
代码是可以运行的,可以尝试一下。
如果写成
typedef char* (*array_func)(int a,char* b); array_func functions[5];
可能更好理解一些。仔细观察:
typedef char* (*array_func[5])(int a,char* b);
和
char* get_info(int id,char* name);
是一样的类型,所以能将get_info赋值给functions[0]。因为functions数组中每个元素都是get_info类型的函数指针。
3.2再来分析一个: void (*b) (void (*) ()) ;
老规矩,先看括号。左面括号里是 *b ,右面括号里是void(*)().最左面还有一个void
很明显啊,这就是一个函数指针,只不过参数复杂了点。
void(*)()!大家一看 ,很眼熟吗,这不又是一个函数指针吗,只不过忘记起名字而已。
我们稍微给他起个名字,
void (*b) (void (*c) ()) ;
那么是不是可以给他typedef了呢,先别急,这里面是不是有2个名字呢?对啊,那样编译器是不是会傻傻分不清呢?
这里姑且给他拆分成2段,实际上同时有函数指针和其他结构并存,我们一般要分步声明!!!
typedef现在就是起个新名字:
typedef void (*param)(); typedef void (*function)(param);
这样的好处大家一会就见到了。现在让我们看代码!
#include <stdio.h> //void (*b) (void (*) ()) ; typedef void (*param)(); typedef void (*function)(param); void my_func(param p);//我们分步声明了,可以直接使用param来做参数 void fff(); int main() { function f; param p; p = fff; f = my_func; f(p); } void my_func(param p) { p(); } void fff() { printf("---- \n\n"); }
可以运行一下代码。
3.3现在看最后一个: doube(*)() (*e)[9];
--->类似char x;的造型。
相信大家很快就看出来了啊, doube(*)() 是一个函数指针,(*e)[9]是一个数组指针,就是个指针! 步长是9. 这个指针的类型是 函数指针。有点绕。
那么按照我们上个例子的总结,要分开声明一下。
typedef double (*func)(); typedef func(*array)[9];
#include <stdio.h> #include <stdlib.h> //doube(*)() (*e)[9]; typedef double (*func)(); typedef func(*array)[9]; array func_array ; double get_number() ; int main() { func_array = (array)malloc(sizeof(array));//切记,指针使用时要申请内存 (*func_array)[0] = get_number; printf("%f \n\n\n",(*func_array)[0]()); } double get_number() { return 1000000; }
这段代码,大家看一下,就可以啦。
暂时到这。