C++學習札記20140318

數組形參

數組的兩個特殊性質1不允許拷貝數組,2使用數組時會將其轉換成指針

我們可以把形參寫成類似數組的形式

//儘管形式不同,但是這三個函數是等價的,,形參完全一樣 const int *

void print(const int *)

void print(const int [])//函數的意圖是作用一個數組

void print(const int [10])//這裏的維度表示我們期望數組含有多少個元素,實際不一定


管理數組的方法

1 處理C風格字符串,遇空字符時停止

void print(const char *cp)

{

if(cp)//若cp不是一個空指針

{

while(*cp)//只要cp指針所指的字符不是空字符

{

cout << *cp++ << ' ';

}

}

}

2 使用標準庫

void print(const int *beg, const int *end)

{

while(beg != end)

{

cout << *beg++;

}

}

調用這個函數我們要傳入兩個指針,一個指向首元素,一個指向尾元素

int j[] = {0, 1};

print(begin(j), end(j));//begin和end函數返回兩個指着,分別指向首元素和尾元素的下一個位置

3 顯式傳遞一個表示數組大小的形參

//const int ia[] 等價於 const int *ia

//size表示處理數組的大小,將它顯式的傳給函數節控制對ia元素的訪問

void print(const int ia[], size_t size)

{

for(size_t i=0; i !=  size; ++i)

{

cout << ia[i];

}

}

print(j,  end(j)-begin(j))

數組引用形參

形參可以是數組的引用,此時引用形參綁定到對應的實參上,也就是綁定到數組上
void print( int (&arr)[10] )//&arr兩端的括號必不可少  int &arr[10]聲明成了引用的數組,這是個數組含
//有10個引用的元素,這是錯誤的
{
;//處理引用的數組
}

傳遞多維數組

數組第二維的大小都是數組類型的一部分,不能省略!!
//matrix指向數組的首元素,該數組的元素是由10個整數構成的數組
void print( int (*matrix)[10],   int rowSize)//matrix兩端括號必不可少
上述語句將matrix聲明成指向含有10個整數的數組指針。
//等價定義
void print( int matrix[][10],   int rowSize)//看起來像二維數組,實際上形參是指向含有10個整數的數組指針

引用返回左值

函數的返回類型決定函數調用是否是左值
調用一個返回引用的函數得到左值,其它返回類型得到右值

返回數組指針

函數可以返回數組的指針或引用,但是定義一個返回數組的指針或者引用的函數比較繁瑣,使用類型別名可以簡化這個任務
typedef int arry[10]; //arry是一個類型別名,它表示的類型是含有10個整數的數組
using arry = int[10]; //與上一句等價,不過是C++11的標準
arry  *func(int i); //func返回一個指向含有10個整數的數組指針

聲明一個返回數組指針的函數

要想在聲明func時不使用類型別名,我們必須牢記被定義的名字後面數組的維度
int arr[10]; //arr是一個含有10個整數的數組
int *p1[10]; //p1是一個含有10個int型指針的數組
int (*p2)[10]; //p2是一個指針,它指向含有10個整數的數組
和這些聲明一樣,如果我們想定義一個返回數組指針的函數,則數組的維度必須跟在函數名字之後,然而,函數的形參列表也跟在函數名字後面,且形參列表應該先於數組的維度。返回數組指針的函數形式如下:
type (*function(parameter_list)) [dimension]
具體的例子,下面這個func函數的聲明沒有使用類型別名:
int  (*func(int i)) [10];
逐層理解該聲明的含義
1 func(int i)表示調用func函數時需要一個int類型的實參
2 (*func(int i))意味着我們可以對函數調用的結果執行解引用操作
3 (*func(int i)) [10]表示解引用func的調用將得到一個大小是10的數組
4  int  (*func(int i)) [10]表示數組中的元素是int類型、
使用尾置返回類型,c++11新標準

main:處理命令行選項

在VS2010中選擇項目->屬性->配置屬性->調試->命令行參數,輸入參數即可
#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
	if (argc > 2) {
		std::string str = argv[1];
		str += argv[2];
		std::cout << str << std::endl;
	} else {
		std::cout << "error" << std::endl;
	}

	return 0;
}


#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
	for (int i=0; i<argc; i++) {
		std::cout << i+1 << "," << argv[i] << std::endl;
	}

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章