我們先來考慮爲什麼需要參數傳遞。
首先,函數之間共享數據是通過參數傳遞完成的
其次,它是函數封裝的體現。
(1)外界對函數的影響僅限於傳遞的參數,把函數內的具體實現細節對外隱藏,只要參數不變,不影響函數的使用
(2)函數對外界的影響僅限於函數的返回值以及傳數組及指針形參
那麼有幾種參數傳遞形式呢?
下面我們就來依次介紹!
一.參數傳遞——值傳遞
方式:函數的形參的類型爲簡單變量
當實參傳遞形參時,系統會建立一份實參的拷貝給形參。當函數調用完畢,這份實參的拷貝消失。
特點:傳值調用不會影響實參的值
二.參數傳遞——地址傳遞
地址傳遞的特徵,形參的改變會影響實參的改變
1.地址傳遞——傳數組的首地址
數組名作函數參數時所進行的傳送是地址的傳送,也就是把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之後與實參數組爲同一數組,共同擁有一段內存空間。
程序示例:
(1)定義函數,功能是求出一維數組的最大值
#include<iostream>
using namespace std;
int Max(int b[],int n)
{
int max=b[0];
int i;
for(i=1;i<n;i++)
if(b[i]>max)
max=b[i];
return max;
}
int main()
{
int i;
int a[10]={1,2,3,4,5,6,7,8,9,10};
cout<<Max(a,10)<<endl;
return 0;
}
(2)對一維數組元素左移n位
a[10]={1,2,3,4,5,6,7,8,9,10},移動5位
則爲a[10]={6,7,8,9,10,1,2,3,4,5}
#include<iostream>
using namespace std;
void fun(int *b,int m,int n)//m是數組有多少個數,n是向左移幾位
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=0;j<m-1;j++)
{
int t;
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
int main()
{
int i,n;
cin>>n;
int a[10]={1,2,3,4,5,6,7,8,9,10};
fun(a,10,n);
for(i=0;i<10;i++)
{
cout<<a[i];
}
return 0;
}
2.傳二維數組的首地址
形參格式:
用指向數組的指針變量
例:
fun(double(*p)[N])
用二維數組
例:
fun(double a[][N])
或
fun(double a[M][N])
例:3個學生各學四門課,計算總平均分,並輸出第n個學生的成績
#include<iostream>
using namespace std;
void average(float *p,int n)
{
float *p_end,sum=0,aver;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
cout<<"average="<<aver<<endl;
}
void search(float (*p)[4],int n)
{
int i;
cout<<n<<"學生的成績";
for(i=0;i<4;i++)
{
cout<<*(*(p+n)+i);
}
}
int main()
{
float score[3][4]={{65,67,79,60},{80,87,90,81},{90,99,100,98}};
average(*score,12);//*score爲列指針
search(score,2);//search爲行指針
}
注:如果直接寫二維數組的名字,就是行指針;取*
後就是列指針。
在這裏對二維數組和指針之間的關係做一個歸納:
對二維數組a需要理解下列地址表示的含義:
a
——行地址,數組的首地址,第0行首地址
a+i
——行地址,第i行的首地址;
a[i]
等價於*(a+i)
——列地址,第i行第0列的元素地址
a[i]+j
等價於*(a+i)+j
——列地址,第i行第j列的元素地址
*(a[i]+j)
等價於*(*(a+i)+j)
等價於a[i][j]
——第i行第j列元素值
3.傳引用
這個在之前的引用變量及其作用中已有詳細說明,在此不再多加贅述。