//由於數組的元素個數默認情況下是不作爲實參內容傳入調用函數的,本程序用來討論有此帶來的
//相關問題,以及解決問題方法,即給調用函數傳遞數組的元素個數的幾種有效方法並實現它
void PutArray1(int *p,int length);
void PutArray2(int p[],int length);
void PutArray3(int p[10]);
void
PutArray4(int (&p)[10]);
void
PutArray5(vector<int>verc);
#include<iostream>
#include<vector>
using namespace std;
void PutArray1(int *p,int length)
{
for(int ix=0;ix<length-1;ix++)
cout<<p[ix]<<"\t";
cout<<p[ix]<<endl;
}
void PutArray2(int p[],int length)
{
for(int ix=0;ix<length-1;ix++)
cout<<p[ix]<<"\t";
cout<<p[ix]<<endl;
}
void PutArray3(int p[10])
{
for(int ix=0;ix<9;ix++)
cout<<p[ix]<<"\t";
cout<<p[ix]<<endl;
}
void PutArray4(int (&p)[10])//注意對int數組的引用是int (&a)[10],而不是int & a[10],否則有編譯錯誤
{
for(int ix=0;ix<9;ix++)
cout<<p[ix]<<"\t";
cout<<p[ix]<<endl;
}
void PutArray5(vector<int>verc)
{
vector<int>::iterator begin_iter=verc.begin();
vector<int>::iterator end_iter=verc.end();
int size=verc.size ();
cout<<"使用兩個迭代器來輸出int向量"<<"\n"<<endl;
for( vector<int>::iterator iter=begin_iter ;iter!=end_iter;iter++)
cout<<*iter<<"\t";
cout<<endl;
cout<<"使用向量參數傳進來的元素規模輸出int向量\n"<<endl;
for(int ix=0;ix<size-1;ix++)
cout<<verc[ix]<<"\t";
cout<<verc[ix]<<endl;
}
void main()
{
int a[10]={0,1} ,b[8]={0,1};
vector<int> verc1(a,a+10);
vector<int> verc2(b,b+8);
cout<<"數組a[10]調用函數PutArray1的結果爲:\n"<<endl;//由此PutArray1和PutArray2和PutArray3的第一次輸出的輸出結果可以
PutArray1(a,10);
cout<<"數組a[10]調用函數PutArray2的結果爲:\n"<<endl;//說明PutArray1(int * p)和PutArray2(int p[])以及PutArray3(int p[10]這
PutArray2(a,10);
cout<<"數組a[10]調用函數PutArray3的結果爲:\n"<<endl;//三個函數是等價的;實參傳遞的都是int *p;他們的元素個數都不作爲實參內容傳進
PutArray3(a);
cout<<"數組b[8]調用函數PutArray3的結果爲:\n"<<endl; //函數。
PutArray3(b);
cout<<"向量verc1調用函數PutArray5的結果爲:\n"<<endl;
PutArray5(verc1);
cout<<"向量verc2調用函數PutArray5的結果爲:\n"<<endl;
PutArray5(verc2);
}
/*
(1)對於數組a[10]作爲實參,對所有的以數組作爲實參的函數的調用得用PutArray3(a),
而不能用PutArray3(a[10])和PutArray(a[]),否則出現編譯錯誤,
這是由於數組的大小不作爲實參的內容傳遞的原因
前者出現error C2664: 'PutArray3' : cannot convert parameter 1 from 'int' to 'int []'
後者出現error C2059: syntax error : ']'的提示。
(2)注意對PutArray3(b)的調用,聲明裏面形參爲int[10],調用的時候傳入的實參爲int [8],
卻能夠編譯成功,有利的證明了數組實參的元素個數確實是不作爲實參的內容傳入函數的
運行也沒有什麼錯誤,傳人的八個元素,顯示的確實十個,後面兩個是隨機的,實際是不屬於
數組B的內容的,所以此處容易出現潛在的數組越界錯誤
(3)當調用PutArray4(b)的時候,由於實參是對數組的引用,它的元素個數是作爲實參的一部分
傳入函數的,所以當調用PutArray4(b)的時候,出現如下的編譯錯誤:
error C2664: 'PutArray4' : cannot convert parameter 1 from 'int [8]' to 'int (&)[10]'
(4)PutArray5(verc1)和putArray(verc2)的調用是爲了練習對vector和iterator的使用,同時說明了
vector容器類型作爲實參的方法也可以用來傳遞數組的元素個數。
總結:可以用來傳遞數組元素個數的方法有如下3種:
(一)用兩個實參,一個是數組名,一個是指出它的長度
(二)使用對數組的引用,此時它的數組元素是作爲實參傳入函數的
(三)使用vector向量來代替數組