C和指针 (pointers on C)——第七章:函数(上)
這一章對于有一定C的基礎的人有一定優秀代碼風格的人來說,并非非常虐。關于stdarg宏可能有些陌生。它負責可變參數列表的定義。
總結:
新式風格和舊式風格就不要提了。八百年前的事情。
函數常見的是把原型放在一個單獨的文件中,當其它文件須要這個原型時,就用#include指令把這個文件包括進來,這個技巧能夠使原型必需的拷貝份數降低到最低,有助于提高程序的可維護性。
return語句用于指定從一個函數返回的值,假設沒有返回值,為void。
函數的參數是通過傳值的方式進行轉換,實際傳遞的實參的一份拷貝。因此,函數能夠改動它的形參的拷貝,而不會改變參數原值。
數組名也是通過傳值方式傳遞的。但它傳給函數的是一個指針的拷貝。數組形參使用了下標引用操作,就會引發間接訪問操作,實際訪問的是數組元素。
抽象數據類型(ADT),又叫黑盒。
由接口和實現兩部分組成。
接口是共同擁有。說明客戶怎樣使用ADT所使用的功能。
實現是私有,實際運行的部分。
遞歸函數直接或者間接的調用自身。
有些遞歸比方尾部遞歸能夠用迭代來實現,效率會高非常多。尤其是斐波那契數列。
可變的參數數量和類型。他們能夠用stdarg.h頭文件所定義的宏來實現。可變參數能治從第一個到最后一個依次訪問。
以下會弄個樣例來說明可變參數。
警告:
1、錯誤地在其它函數的作用域內編寫函數原型。
恩,注意函數的鏈接屬性。
假設在其它函數的代碼塊里就無法使用該函數。
2、沒有為那些返回值不是整數的函數編寫原型。
由于返回值的缺省值是整型。
3、在va_arg中使用錯誤的參數類型。導致沒有定義的結果。
看個樣例:
#include <stdarg.h>
/* 取形參的平均值 */
float average(int n_value,...)
{
va_list var_arg;
int count;
float sum=0;
/** 準備訪問可變參數 */
va_start(var_arg, n_values);
/* 加入取自可變參數列表的值 */
for(count = 0; count < n_values; count += 1)
{
sum += va_arg(var_arg, int );
}
/* 完畢處理可變參數 */
va_end(var_arg);
return sum/n_values;
}
參數類型必須明白在va_arg(var_arg, ***)中說明,務必!
編程提示:
1、在函數原型中使用參數名。能夠給函數的用戶提供很多其它的信息。
請盡量使用參數名,不要這樣的:
int func(int , int);
從函數名到形參一坨shi。
2、抽象數據類型能夠降低程序對模塊實現的細節的以來。提高可靠性。
3、當遞歸定義清晰的這點能夠補償它的效率時。就用遞歸吧。
轉載于:https://www.cnblogs.com/mqxnongmin/p/10766271.html
總結
以上是生活随笔為你收集整理的C和指针 (pointers on C)——第七章:函数(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 18.04搭建Git服务器
- 下一篇: 有用的SQL查询