指针&函数
#include <stdio.h>
#include <stdlib.h>
//单片机函数的写法,入口函数,中断函数等等
(*(void(*) ())0)(); //调用地址=0的地方的入口代码
//声明一个函数,地址在0x8000,接收3个int型参数,返回long型结果
((long (code *) (int int int ) 0x8000)(1,2,3);
//取结构字段偏移量
#define OFFSET(TYPE, MEMBER) ((unsigned long)(&(((TYPE *)0)->MEMBER)))
typedef struct aa
{
int a;
char b;
char c;
int d;
}stru_aaa;
unsigned long offset = OFFSET(stru_aaa,c);
void Function()
{
printf("Call Function!\n");
}
char * fun(char * p1,char * p2)
{
printf("Call Fun!\n");
return NULL;
}
int main()
{
/*函数指针,这里的pfunc不是一个函数名,而是一个函数指针。
返回类型是char指针。*/
char * (*pfunc)(char * p1,char * p2);
pfunc = &fun; //取址
(*pfunc)("aa","bb"); //取值
//值是一样的
printf("%d %d\n", (int)fun, (int)(&fun));
//%p是16进制的,其实两个值也是一样的
printf("%p %d\n", &fun, (int)(&fun));
//函数名是一个"代码地址值",取址函数名,还是一个地址值
if((int)fun == ((int)(&fun))) printf("it is same\n");
void (*p)();
/*&p是求函数指针变量p本身的地址,结果是一个指针的指针*/
/*(int*)&p表示将地址强制转换成指向int类型数据的指针*/
/*(int)Function表示将函数的入口地址强制转换成int类型的数据*/
*(int*)&p=(int)Function; //复杂,无意义,但正确
(*p)();
//简单一点处理
void (*p2)();
p2 = Function;
(*p2)();
return 0;
}
// [] 优先级高于 *
//指针数组
char * arStr[101];
//函数指针数组
char * (*pf[3])(char * p);
fp[0] = func0;
fp[1] = func1;
pf[2] = func2;
//指向数组的指针
char (*arStr)[101]; //char arStr[10][101];
//数组指针:指向数组的指针
char * arStr[101];
//指向”函数指针数组“的指针;
char * (*(*pf)[3])(char * p);
pf[0][0]("para1");
pf[0][1]("para2");
pf[0][2]("para3");
//定义一个函数指针类型
typedef int (*FP_CALC)(int,int);
FP_CALC pFun; //定义函数指针
//函数指针类型应用于函数中
FP_CALC myFunc(int i, int j, FP_CALC)
{
...
}