一、C指针
1、指针的基本概念
(1)指针是一个程序实体所占用内存空间的首地址
(2)指针变量
语法格式:
数据类型 * 变量名;
例如: int * p1;
注:我记得在C语言中*靠近int那么(int *)是一个整体,表示整型指针类型;*靠近p1则(*p1)是一个整体,*p1是一个整型变量。在C++中,靠前靠后就都一样了,都表示一个整型指针。
(3)指针变量必须赋值之后才能使用
例如:
int * p2; //定义整型指针变量
p2=(int *)0x44600000; //将地址强制转换为指针类型,这样才能赋值。
(4)取值运算符与取址运算符
*:取值;
&:取址。
2、函数指针
函数指针:指向一个函数,也即函数的首地址。
语法格式:
返回值类型 (*变量名)(参数1类型,参数2类型,······);
例如:
int (*pf)(int,float);
上式中pf就是一个函数指针变量。
函数指针用法例子:
int fun(int,float)
{
·········//用户代码
}
int main(void)
{
·········//用户代码
pf=fun;
pf(10,123.66);
return 0;
}
3、函数指针作为函数参数及回调函数
在C语言中,任何合法的数据类型均可以作为函数的参数,函数指针当然也可以。
例如:
int fun(int,float)
{
·······//用户代码
}
void sys_fun(int(*pf)(int,float))
{
·······//用户代码
pf(10,13.6);
·······//用户代码
}
int main(void)
{
·······//用户代码
sys_fun(fun);
·······//用户代码
}
二、typedef常用方法
1、复杂的数据结构名称的简化
例如:函数指针类型
void (*)(int,int);
使用关键字typedef
typedef void (*PFON)(int,int);
后续再进行函数指针变量定义时:
PFON function;
上面比较简单,下面举一个比较难的:
void (* b[10])(void(*)(int,int));
在这个定义中,表达的是函数指针嵌套函数指针,并且函数指针是一个数组。b为程序实体名称,b为一个含有10个元素的指针数组。
由于b为一个数组,可以把上边进行简化:
void (* b)(void(*)(int,int));
void(*)(int,int);是一个类型,可以对它进行简化。如下所示:
typedef void(*Pfun)(int,int);
于是原来的就可以写成如下形式:
void (*b)(Pfun);
接下来在进行下一步化简:
typedef void(*PFUN)(Pfun);
通过上面定义就可以到最简:
PFUN b[10];
2、增强代码的可读性
例如:
typedef int AGE; //年龄
typedef int SIZE; //尺寸
3、定义与平台无关的数据
4、避免出错
三、常用数据类型及数据结构
1、控制块
控制块是被控对象在操作系统世界的身份证。
从代码上看,控制块就是一个数据结构体,例如:
typedef struct tcb
{
char* code_name; //代码名称
int p; //重要性级别
int v_number; //版本号
void (*fun)(void); //指向被管理代码的指针
}TCB;
2、同类控制块的登记造册
登记造册使用数组或者链表都可以。
3、队列与堆栈
(1)队列:先进先出
(2)堆栈:先进后出
注:详细内容参考数据结构与算法