重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
C++對于返回值的類型有一定的限制:不能是數組,但可以是其他任何類型——整數、浮點數、指針,甚至可以是結構和對象(有趣的是,雖然C++函數不能直接返回數組,但可以將數組作為結構或對象組成部分來返回)。
在函數聲明的參數列表中,可以包括變量名,也可以不包括。原型中的變量名相當于占位符,因此不必與函數定義中的變量名相同。
在C++中,括號為空與在括號中使用關鍵字 void 是等效的——意味著函數沒有參數。
在 C++ 中,不指定參數列表時應使用省略號:如:
void say_bye(…);
通常,僅當與接受可變參數的 C 函數(如printf()) 交互時才需要這樣做。
靜態類型檢查,編譯階段,檢查函數參數類型是否正確,并進行可以進行的類型轉換。
函數參數和按值傳遞聲明中的變量名不必與定義中的變量名相同,而且可以省略。
一句話總結,按值傳遞就是函數自身會創建以形參名為名的變量來使用,并不會修改給函數傳值的實參的值。
函數和數組函數如何用指針來處理數組?
在大多數情況下,C++ 將數組名視為指針,但有一些例外,首先,數組聲明使用數組名來標記存儲位置;其次,對數組名使用 sizeof 將得到整個數組的長度(以字節為單位),第三,將地址運算符&用于數組名時,將返回整個數組的地址,對它加1是加整個數組占用的字節數,而不是單個元素的字節數。
int sum_arr(int arr[], int n);
int sum_arr(int * arr, int n);
用 int * arr 替換了 int arr[],這兩個函數頭都是正確的,在C++中,僅在函數參數列表中,int *arr 和 int arr[]才是相同的。它們都意味著 arr 是一個int指針。然而,數組表示法( int arr[] ) 提醒用戶,arr 不僅指向int,還指向int數組的第一個int。
當指針指向數組的第一個元素時,一般使用數組表示法;而當指針指向一個獨立的值時,一般使用指針表示法。
但在其它上下文中,并不能用 int arr[]來聲明一個指針。
傳遞常規變量時,函數將使用該變量的拷貝,但傳遞數組時,函數將使用原來的數組。實際上,這種區別并不違反C++按值傳遞的原則,傳遞數組時仍然傳遞了一個值,這個值是地址,這個值被賦給了一個新的變量,但是這個值(也就是這個地址)指向的就是原來的數組。
注意,函數參數里使用int arr[],在函數內對arr使用sizeof,得到的是指針變量的長度,而不是整個數組的長度。這也是必須顯示傳遞數組長度,而不是在函數內部使用sizeof的原因;指針本身并沒有指出數組的長度。
注意,為將數組類型和元素數量告訴數組處理函數,請通過兩個不同的參數來傳遞它們:
void fillArray(int arr[], int size);
而不要試圖使用方括號表示法來傳遞數組長度:
void fillArray(int arr[size]);這是錯誤的。
void show_array(const double ar[], int n);
const double arr[],表明,指針ar指向的是常量數據,這意味著不能使用arr修改該數據。但這并不意味著原始數組必須是常量,而只是意味著不能在show_array()函數中使用 ar 來修改這些數據。
對于處理數組的 C++ 函數,必須將數組中的數據種類、數組的起始位置和數組中元素數量提交給它;傳統的C/C++方法是,將指向數組起始處的指針作為一個參數,將數組長度作為第二個參數。還有另一種給函數提供所需信息的方法,即指定元素區間(range),這可以通過傳遞兩個指針來完成:一個指針標識數組的開頭,另一個指針標識數組的尾部。
C++禁止將const變量的地址分配給非const指針。(如果非要這樣做,可以使用強制類型轉換來突破這種限制)
注意
const int * ps
int * const ps
兩者的區別是,前者表示指針指向的內容不能被修改,后者表示指針本身不能被修改
int sum( int (*ar)[4], int size);
int sum( int ar[] [4], int size);
使用方式
ar[r][c];
*(*(ar+r)+c)
函數和C-風格字符串C-風格字符串由一系列字符組成,以空字符結尾。有關函數的數組的規則也適用于字符串函數。但字符串還有一些特殊的規則。
假設要將字符串作為參數傳遞給函數,則表示字符串的方式有三種:
可以說是將字符串作為參數來傳遞,但實際傳遞的是字符串第一個字符的地址。這意味著字符串函數聲明將其表示字符串的形參聲明為 char* 類型。
C-風格字符串與常規 char 數組之間的一個重要區別是,字符串有內置的結束字符,這意味著不必將字符串長度作為參數傳遞給函數,而函數可以使用循環以此檢查字符串中的每個字符,指導遇到結尾的空字符為止。
一種處理字符串中字符的標準方式:
while(*str){statements;
str++;
}
函數和結構為結構編寫函數比為數組編寫函數要簡單得多,雖然結構變量和數組一樣,都已存儲多個數據項,但在涉及到函數時,結構變量的行為更接近于基本的單值變量。使用結構來編程時,最直接的方式是像處理基本類型那樣來處理結構:也就是說,將結構作為參數傳遞,并在需要時將結構用作返回值使用。
按值傳遞;傳遞地址,使用指針來訪問結構的內容;按引用傳遞。
按值傳遞:當將一個實參傳遞給函數時,結構的內容會被拷貝到形參中,函數隨后使用拷貝完成工作。
使用指針傳遞的時候可以把要修改的結構的地址作為一個參數,傳遞給函數。
函數和 string 對象除了getline()外,程序一般像對待內置類型一樣對待string對象。
函數和 array 對象如果需要使用array類,要包含頭文件array,而名稱array位于名稱空間std中。
std::array
使用指針來操作array的時候要注意運算優先級的問題;
(*pa)[i]才能表示array的第i項;
從函數體內調用函數本身的地方開始,調用者暫停運行,執行被調用者代碼。
遞歸的方式可用于分而治之的策略。
函數指針與數據項相似,函數也有地址。函數的地址是存儲其機器語言代碼的內存的開始地址。通常,這些地址對用戶而言,既不重要,也沒有什么用處,但對程序而言,卻很有用。例如,可以編寫將另一個函數的地址作為參數的函數。這樣第一個函數將能夠找到第二個函數,并運行它。與直接調用另一個函數相比,這種方法很笨拙,但它允許在不同的時間傳遞不同函數的地址,這意味著可以在不同的時間使用不同的函數。
函數指針的基礎知識獲取函數地址
使用函數名(后面不跟參數)即可。
聲明函數指針
double pam(int);
double (*pf) (int);
void estimate(int lines, double (*pf) (int));
estimate(50, pam);
顯然,使用函數指針時,比較棘手的是編寫原型,而傳遞地址則非常簡單。
使用指針來調用函數
double pam(int);
double (*pf) (int);
pf = pam;
double x = pam(4);
double y = (*pf)(5);
實際上,C++ 也允許像使用函數名那樣使用 pf:
double y = pf(5);
第一種格式較為復雜,但是給出了強有力的提示——代碼正在使用函數指針。
注意這里和普通變量不同,對函數指針來說 使用(*pf) 和pf作為函數名都是可以的,兩者是等價的,而普通變量的指針不是這樣。
深入探討函數指針注意以指針為元素的數組,和指向數組的指針在表示上的區別,
[]的優先級比*高
函數指針可以在聲明的時候初始化,方法是 聲明時像賦值語句一樣賦值(賦值的內容是函數名)
注意使用 auto
還可以使用 typedef 來簡化
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧