C++函数概念解析(2)
數組形參
我們為函數傳遞一個數組時,實際傳遞的是這個數組的指針
void print(const int*); void print(const int[]);//函數的意圖是作用于一個數組 void print(const int[10]);以數組作為形參的函數也必須保證這個數組不越界
使用標記指定數組長度
以C風格字符串為例,函數在遇到空字符時停止
void print(const char*cp) {if(cp)while(*cp)cout<<*p++; }適合有明顯結束標記且數據類型不容易混淆,比如一段文章的結尾
使用標準庫規范
傳遞數組首元素指針與尾元素指針也是一種管理數組形參的方法
void print(const int*beg,const int*end) {while(beg!=end)cout<<*beg++<<endl; }//輸出beg與end之間所有的元素調用如下:
int j[2]={0,1}; print(begin(j),end(j));第三種方法是專門定義一個表示數組大小的形參
void print(const int ia[],size_t size)//記錄大小的數據類型 {for(size_t i=0;i!=size;++i)//size_t就是專門記錄數據大小的數據{cout<<ia[i]<<endl;} }調用print函數時
int j[]={0,1};print(j,end(j)-begin(j))C++中沒有真正的多維數組
C++ 里面更嚴格來說其實只有數組的數組(又稱jagged array),這是為什么呢?在MSDN的第CA1814號文件中找到了答案:
In a multidimensional array, each element in each dimension has the same, fixed size as the other elements in that dimension. In a jagged array, which is an array of arrays, each inner array can be of a different size. By only using the space that’s needed for a given array, no space is wasted.
翻譯過來就是:
在多維數組中,每個維度中的每個元素與該維度中的其他元素具有相同的固定大小。在一個鋸齒狀數組(即數組的數組)中,每個內部數組可以具有不同的大小。通過只使用給定數組所需的空間,不會浪費任何空間。
C#與VB是真正支持多維數組的
main()函數
之前我們的main()函數基本為空,有時候確實需要給main()函數傳遞形參
int main(int argc,chat *argc[])第一個形參表示的是數組中字符串的數量
第二個形參argv是一個數組,它的元素是指向C風格的字符串的指針
復習一下形參的作用:
它可以看成引用對象的另一個名字,不額外占用空間,效率高
在使用argv中的實參的時候,從argv[1]開始,argv[0]是給保存程序的名字
無法預知有多少個實參的時候
initializer_list形參
void error_msg(initializer_list<string> il) {for(auto beg=i1.begin();beg!=i1.end();++beg)cout<<*beg<<" ";cout<<endl; }省略符形參
void foo(parm_list,...); void foo(...);函數的返回值
每個函數都必須有一個返回值嗎?答案是否定的
左值與右值
一些語言使用左值(l-value)和右值(r-value)的概念。左值具有確定的、可以被獲得的內存地址。這意味著左值可以是變量,也可以是對指向特定內存地址的指針解引用(dereference)的結果。例如C語言的表達式(4 + 9),在執行時,計算機生成一個整數值13,但因為程序沒有明確指定這個13如何在計算機中存儲,所以這個表達式產生一個右值。另一方面,如果一個C程序聲明了一個變量x并將x賦值為13,那么表達式(x)的值是13,并且是一個左值
調用一個返回引用的函數得到左值,其他返回類型得到右值
特別的,我們能為返回類型是非常量引用的函數的結果賦值
列表初始化返回值
函數可以返回花括號包圍的值的列表,函數不能返回數組,但可以返回數組的指針
總結
以上是生活随笔為你收集整理的C++函数概念解析(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在 Windows 中使用「iClo
- 下一篇: C++中函数概念解析(3)