C语言的typedef理解

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

这段代码,大家看一下,就可以啦。

暂时到这。


你可能感兴趣的:(C语言的typedef理解)