//在原型的函數裏面可以包括變量名也可以不包括。原型中的變量名相當於佔位符,因此不必與函數頂一種的變量名相同。
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_);