1. 把函数作为另一个函数的参数
代码:
// 作为参数的函数
uint8_t returnA(uint8_t A)
{
return A;
}
// 使用函数作为参数的另一个函数
void TestFun(uint8_t (*fun)(uint8_t A))
{
uint8_t iii = 0;
iii = fun(10);
SEGGER_RTT_printf(0,"test %d\n", iii);
}
// 测试
TestFun(returnA);
现象:
总结:
1. 函数作为参数必须与要使用的原函数的返回类型和参数一致
2. 函数作为参数只是把函数传递,不能连带原函数的参数进行传递
2. 变量地址作为函数参数,函数内不能使用该变量自增
代码:
void Overtime_handle(uint16_t *counter, bool *overTime_flag, uint16_t overTime)
{
if(*overTime_flag)
{
// 不能这样写
//*counter++;
// 必须这样写
*counter = *counter + 1;
#ifdef DEBUG_printf
SEGGER_RTT_printf(0,"counter adding %d\n", *counter);
#endif
}
if((*counter >= overTime) && *overTime_flag)
{
*overTime_flag = 0;
*counter = 0;
#ifdef DEBUG_printf
SEGGER_RTT_printf(0,"counter end\n");
#endif
}
}
现象:
使用*counter = *counter + 1;
使用*counter++;
结论:
// 不能这样写
//*counter++;
// 必须这样写
*counter = *counter + 1;或 *counter += 1;
3. 指针如果指向的是常量则只读不可写
4. sizeof长度
// 指针的长度为系统位数/8,因为指针存放的是变量地址
// 指针指向的内容的长度为指针类型的长度
char *p = "123456";
printf("%d\n", sizof(p)); // 64位系统为8 32位系统为4
printf("%d\n", sizof(*p)); // 1
// 未指明数量的数组的长度是内容长度+1,因为系统默认添加'\0'结束符
char p[] = "123456";
printf("%d\n", sizof(p)); // 7
// 指明数量的数组的长度是数组的数量
char p[6] = "123456";
printf("%d\n", sizof(p)); // 6