2015.5.15(尴尬的时间)
看工程中博通的代码,有些c语言基础还不太了解,于是,深入了解总结了一下,如下:
一、常规用法
//常规用法1,不谈
typedef unsigned int uint;
//常规用法2,不谈
typedef struct l2_table
{
......
} l2_table_t;
typedef unsigned char mac_t[6];
//定义变量
mac_t mr8012_mac;
//变量的使用
memset(mr8012_mac, 0, 6);
mr8012_mac[0] = 0x12;
.........
mr8012_mac[5] = 0x99;
三、指针函数
typedef int (*person)(int height, int weight, int num);
person programmer; //也可以定义成数组,和普通变量定义一样.
//函数实现的地方
int group(char *name, int high, int weigh, int no)
{
printf("just have a test, execute nothing.\n");
printf("i'm %s, NO.%d,height;%d,weight:%d.\n",name,no,high,weigh);
return 0;
}
//函数的注册
int programmer_reg(person func)
{
programmer = func;
.....
.....
}
int test5_main()
{
(*progarmmer)(zhangsan, 170, 65, 3);
//若定义成数组,可如下
(*progarmmer[0])(zhangsan, 170, 65, 3);
(*progarmmer[1])(lisi, 171, 64, 4);
(*progarmmer[2])(wangwu, 170, 60, 6);
......
......
}
(1) 用gdb 调试, 每一个函数的函数名对应一个 地址,e.g p group 是 0x80483e4,
而progarmmer 是 一个 函数指针,(其就是一个指针变量, 只不过类型是该函数类型的),
progarmmer指针变量存储的 内容是 0x80483e4;
(2) 引用 progarmmer 和引用 普通的 指针变量一样, 即 *progarmmer,但函数 指针稍不同,
如上边代码一样,要加参数。
注意:在函数注册中 progarmmer_reg() 中,progarmmer = func 可以,而progarmmer = &func也可以;
暂时没有时间研究为什么。
三、普通函数
//typedef 一个普通的函数
typedef int print_t(int no);
//定义一个普通函数的指针
print_t *print_number = NULL;
//待注册到指针上的函数
int print(int number)
{
printf("number==>%d<\n", number);
return 0;
}
void func1()
{
//简单的注册一下,一般都是会有一个专门的注册函数,此处为简便
print_number = print;
//注意:不知道为什么,上边的注册写成 如下语句,也可以正常执行。
print_number = &print;
//执行
(*print_number)(2);
.........
}