//在原型的函数里面可以包括变量名也可以不包括。原型中的变量名相当于占位符,因此不必与函数顶一种的变量名相同。
int prototype(int,int);
//c++可以省去变量名,仅当接受可变参数的c语言(printf)交互时才这么做。
void ellipsis(...);
//定义一个传数组的函数
void log_arr(int arr[], int num)
{
int i;
for (i = 0; i < num; ++i) {
printf("log this num is %d\n", arr[i]);
}
};
//当且仅当用于函数头或者函数原型中,int *arr 和 int arr[]的含义才是相同的,他们都意味着arr是一个int指针
void log_arr_same(int *arr, int num)
{
//数组的两个恒等式
// int i;
// arr[i] == *(arr + i);
// &arr[i] == arr + i;
};
//为了防止函数无意中修改数组的内容,可在声明形参时使用关键词 const
void log_arr_not_modify(const int *arr, int num);
//指针和const
void pointer_and_const()
{
int age = 39;//age can be modify.
const int* pt = &age;//pt can't be modify
//*pt = 38;// read-only variable is not assignable
age = 38; //This's ok.
const int anotherAge = 40;
//int* pAge = &anotherAge;//不可行。
//修改const指针,指向指针的指针
const int **pp2;
int *p1;
const int n = 13;
//pp2 = &p1;//不允许
*pp2 = &n;
*p1 = 10;
};
//传一个二维数组,第二维长度智能为4
int sum(int arr[][4], int size);
int sum_same(int (*arr)[4], int size);
//传递结构的地址而不是整个结构可以节约时间和空间
//void print_student(const Student* stu);
//递归
void recurs(int start)
{
printf("recures is %d\n", start);
if (start)
{
recurs(--start);
}
else
{
printf("recures is done\n");
}
printf("end\n");
}
//函数指针
void func_pointer_test()
{
static int i = 0;
++i;
printf("我被调用了--%d\n", i);
}
void func_pointer()
{
/*
为提供正确的运算符优先级,必须在声明中使用括号将*pf括起。括号的优先级比*高。
因此*pf(int) 意味着pf()是一个返回指针的函数
而(*pf)(int) 意味着pf是一个指向函数的指针
*/
void (*pf)(void);
pf = func_pointer_test;
pf();
}
//声明,并实现一个传入一个函数及执行次数的函数
void func_pointer_callback(void (*pf)(void),int times)
{
while (times--)
{
pf();
}
}
void func_pointer_declare()
{
//声明并实现长度为三的函数指针数组
void (*pf[3])(void) {func_pointer_test, func_pointer_test, func_pointer_test};
pf[0]();
//使用typedef进行简化
typedef void(*call_back)(void);
call_back back = func_pointer_test;
back();
call_back fun_pointer_arr[3] = {back, back, back};//三个函数指针的数组
fun_pointer_arr[0]();
call_back (*pointer_func_arr)[3] = &fun_pointer_arr;//指向有三个方法指针的数组
(*pointer_func_arr[0])();
}
//用于宏测试的方法
int add(int a, int b){
return a + b;
}
// 定义测试static的方法
int count()
{
//只会在函数声明的时候声明这个变量。
static int count = 0;
++count;
return count;
}
//定义宏方法
#define ADD(_Num1_,_Num2_) add(_Num1_,_Num2_);