C++ 函數



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








發佈了39 篇原創文章 · 獲贊 4 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章