1.函数定义
函数返回值(任意数据类型) 函数名(命名法则) (参数<任意数据类型>)
整形:
char
short (int)
int
long (int)
long long (int )
实型:
float
double
long double
符合数据类型:
数组:指针体现
枚举 enum
结构体
联合体
指针:
2.函数与指针
1.指针函数
指针函数:有指针参与的函数(返回值,参数)
参数:指针
经典例子:交换算法
无法交换
void exchange(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
能交换
void exchange(int *a,int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
返回值:
错误的写法
int * fun()
{
int a=3;
return &a;
}
正确的写法
int * fun()
{
static int a=3;
return &a;
}
2.函数指针
函数指针:指向一个函数的指针
指针(32 4字节):1.地址 2.从这个地址开始的操作方式
函数指针 :1.代码段的地址 2.从这个地址开始执行
函数指针变量的定义方式: 返回值 (*变量名)(参数); //int a;int *p=&a;
根据指向的函数参数和返回值的类型的不同,需要定义相应的指针去指向
void fun(int ){
}
void (*p)(int);p=fun;
//------------------------
void fun1(int ,int );//p=fun1 error
void (*p1)(int,int ); p1=fun1 ;
函数指针的赋值:
void fun(int ){
}
void (*p)(int) = fun;//int a=3; 初始化
p = fun;或者 p =&fun; 这两个的效果完全等价,让p指向fun函数
函数指针间接执行代码段方式:
//fun(2);
p(2); 或者 (*p)(2); 这两个的效果完全等价,都是间接执行p所指向的代码段
//函数指针作函数参数(回调,重点) 1.函数指针 2.结构体指针
关键字 volatile
防止编译器优化,
防止硬件、软件意想不到的改变
Gdb 工具的使用
查看文件
(gdb)l
设置断点
(gdb)b 6 (其中数字6是指行号)
查看断点情况
(gdb)info b
运行代码
(gdb)r
查看变量值
(gdb)p 变量名
单步运行
(gdb)n (如果遇到一个函数,并且函数内无断点,就把函数当成一条语句一次性运行完)
或者
(gdb)s (如果遇到一个函数,则会进入该函数中,一步一步运行)
恢复程序运行
(gdb)c
帮助
(gdb) help [command]
sizeof的使用
注意:
sizeof(a)
相当于
#define mysizeof(a) (size_t)((char *)(&a+1) - (char *)&a)
sizeof(type)
相当于
#define mysizeof_t(type) (size_t)((type *)0+1)
其中 注意 a 是变量不是常量!
type 是数据类型,如 int , char等
size_t 实际上是 int ,但是由于每个系统 int 的字节大小不一定,所以用 size_t 代替
最终: sizeof()
相当于
#define mysizeof_zj(x) (size_t)((typeof(a) *)0+1)
其中: typeof(x)是获得x的数据类型,这个x可以是常量
不能对常量取地址!!!
1+1=3 的情况
printf("%d\n",(int)((short *)1+1));
函数指针来模仿多任务(分时复用,时间片)
#include<stdio.h>
void task_qq()
{
;
}
void task_music()
{
;
}
int main()
{
void (*pc)(void);
int flag = 0;
while(1)
{
if(0 == flag) //切换函数
{
pc = task_qq;
flag = 1;
}
else
{
pc = task_music;
flag = 0;
}
pc();
//sleep(1);
}
return 0;
}
typedef 函数指针用法
格式:
typedef 返回类型(*新类型)(参数表)
例子:
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。