# 7.C語言數組名作函數參數
數組名可以作函數的實參和形參。如:
~~~
main(){
int array[10];
/* …… */
/* …… */
f(array,10);
/* …… */
/* …… */
}
f(int arr[],int n);
{
/* …… */
/* …… */
}
~~~
array為實參數組名,arr為形參數組名。在學習指針變量之后就更容易理解這個問題了。數組名就是數組的首地址,實參向形參傳送數組名實際上就是傳送數組的地址,形參得到該地址后也指向同一數組。這就好象同一件物品有兩個彼此不同的名稱一樣。

同樣,指針變量的值也是地址,數組指針變量的值即為數組的首地址,當然也可作為函數的參數使用。
【例10-15】
~~~
float aver(float *pa);
main(){
float sco[5],av,*sp;
int i;
sp=sco;
printf("\ninput 5 scores:\n");
for(i=0;i<5;i++) scanf("%f",&sco[i]);
av=aver(sp);
printf("average score is %5.2f",av);
}
float aver(float *pa){
int i;
float av,s=0;
for(i=0;i<5;i++) s=s+*pa++;
av=s/5;
return av;
}
~~~
【例10-16】將數組a中的n個整數按相反順序存放。
算法為:將a[0]與a[n-1]對換,再a[1]與a[n-2] 對換……,直到將a[(n-1/2)]與a[n-int((n-1)/2)]對換。今用循環處理此問題,設兩個“位置指示變量”i和j,i的初值為0,j的初值為n-1。將a[i]與a[j]交換,然后使i的值加1,j的值減1,再將a[i]與a[j]交換,直到i=(n-1)/2為止,如圖所示。

程序如下:
~~~
void inv(int x[],int n) /*形參x是數組名*/{
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++){
j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;
}
return;
}
main(){
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf("The array has benn inverted:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
~~~
對此程序可以作一些改動。將函數inv中的形參x改成指針變量。
【例10-17】將函數inv中的形參x改成指針變量。程序如下:
~~~
void inv(int *x,int n){ /*形參x為指針變量*/
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--){
temp=*i;
*i=*j;
*j=temp;
}
return;
}
main(){
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf("The array has benn inverted:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
~~~
運行情況與前一程序相同。
【例10-18】從0個數中找出其中最大值和最小值。
調用一個函數只能得到一個返回值,今用全局變量在函數之間“傳遞”數據。程序如下:
~~~
int max,min; /*全局變量*/
void max_min_value(int array[],int n){
int *p,*array_end;
array_end=array+n;
max=min=*array;
for(p=array+1;p<array_end;p++)
if(*p>max) max=*p;
else if (*p<min)min=*p;
return;
}
main(){
int i,number[10];
printf("enter 10 integer umbers:\n");
for(i=0;i<10;i++)
scanf("%d",&number[i]);
max_min_value(number,10);
printf("\nmax=%d,min=%d\n",max,min);
}
~~~
說明:
1) 在函數max_min_value中求出的最大值和最小值放在max和min中。由于它們是全局,因此在主函數中可以直接使用。
2) 函數max_min_value中的語句:
? ? max=min=*array;
array是數組名,它接收從實參傳來的數組numuber的首地址。
*array相當于*(&array[0])。上述語句與 max=min=array[0];等價。
3) 在執行for循環時,p的初值為array+1,也就是使p指向array[1]。以后每次執行p++,使p指向下一個元素。每次將*p和max與min比較。將大者放入max,小者放min。

4) 函數max_min_value的形參array可以改為指針變量類型。實參也可以不用數組名,而用指針變量傳遞地址。
【例10-19】程序可改為:
~~~
int max,min; /*全局變量*/
void max_min_value(int *array,int n){
int *p,*array_end;
array_end=array+n;
max=min=*array;
for(p=array+1;p<array_end;p++)
if(*p>max) max=*p;
else if (*p<min)min=*p;
return;
}
main(){
int i,number[10],*p;
p=number; /*使p指向number數組*/
printf("enter 10 integer umbers:\n");
for(i=0;i<10;i++,p++)
scanf("%d",p);
p=number;
max_min_value(p,10);
printf("\nmax=%d,min=%d\n",max,min);
}
~~~
歸納起來,如果有一個實參數組,想在函數中改變此數組的元素的值,實參與形參的對應關系有以下4種:
1) 形參和實參都是數組名。
~~~
main(){
int a[10];
/* …… */
f(a,10)
/* …… */
f(int x[],int n){
/* …… */
}
}
~~~
a 和 x 指的是同一組數組。
2) 實用數組,形參用指針變量。
~~~
main(){
int a[10];
/* …… */
f(a,10)
/* …… */
f(int *x,int n){
/* …… */
}
}
~~~
3) 實參、型參都用指針變量。
4) 實參為指針變量,型參為數組名。
【例10-20】用實參指針變量改寫將n個整數按相反順序存放。
~~~
void inv(int *x,int n){
int *p,m,temp,*i,*j;
m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--){
temp=*i;
*i=*j;
*j=temp;
}
return;
}
main(){
int i,arr[10]={3,7,9,11,0,6,7,5,4,2},*p;
p=arr;
printf("The original array:\n");
for(i=0;i<10;i++,p++)
printf("%d,",*p);
printf("\n");
p=arr;
inv(p,10);
printf("The array has benn inverted:\n");
for(p=arr;p<arr+10;p++)
printf("%d,",*p);
printf("\n");
}
~~~
注意:main函數中的指針變量p是有確定值的。即如果用指針變作實參,必須現使指針變量有確定值,指向一個已定義的數組。
【例10.21】用選擇法對10個整數排序。
~~~
main(){
int *p,i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
p=a;
sort(p,10);
for(p=a,i=0;i<10;i++){
printf("%d ",*p);
p++;
}
printf("\n");
}
sort(int x[],int n){
int i,j,k,t;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])k=j;
if(k!=i){
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
~~~
說明:函數sort用數組名作為形參,也可改為用指針變量,這時函數的首部可以改為:
? ? sort(int *x,int n)
其他可一律不改。
- 前言
- 一. C語言概述
- 1.C語言的發展及其版本
- 2.C語言工作原理和運行機制
- 3.C語言編譯器(開發工具|IDE)推薦
- 4.C語言的特點
- 5.第一個C語言程序
- 6.C語言輸出函數(printf)和輸入函數(scanf)
- 7.C語言程序的結構特點
- 8.C語言字符集
- 9.C語言詞匯
- 二. C語言算法
- 1.什么是算法|算法的概念
- 2.簡單的C語言算法舉例
- 3.C語言算法的特性
- 4.用流程圖表示算法
- 5.三種基本結構的流程圖
- 6.用N-S流程圖表示算法
- 7.用計算機語言表示算法
- 三. 數據類型和運算符
- 1.C語言的數據類型
- 2.C語言常量與變量
- 3.C語言整型數據
- 4.C語言實型數據
- 5.C語言字符型數據
- 6.C語言變量賦初值
- 7.C語言數據類型轉換
- 8.C語言算術運算符和算術表達式
- 9.C語言賦值運算符和賦值表達式
- 10.C語言逗號運算符和逗號表達式
- 四. 順序程序設計
- 1.C語言語句概述
- 2.C語言賦值語句詳解
- 3.C語言數據的輸入輸出
- 4.C語言字符的輸入輸出
- 7.C語言順序結構程序設計舉例
- 五. 分支結構
- 1.C語言關系運算符和表達式
- 2.C語言邏輯運算符和表達式
- 3.C語言if語句詳解
- 4.C語言switch語句的用法詳解
- 5.C語言條件運算符和條件表達式
- 6.C語言分支結構程序舉例
- 六. 循環控制
- 1.C語言循環控制概述
- 2.C語言goto語句以及用goto語句構成循環
- 3.C語言while語句的用法
- 4.C語言do-while語句的用法
- 5.C語言for語句用法詳解
- 6.C語言幾種循環的比較
- 7.C語言break和continue語句的用法
- 8.C語言循環控制程序舉例
- 七. C語言數組
- 1.C語言一維數組的定義和引用
- 2.C語言二維數組的定義和引用
- 3.C語言字符數組及其應用
- 4.C語言常用字符串處理函數
- 5.C語言數組應用舉例
- 6.C語言數組小結
- 八. C語言函數
- 1.C語言函數概述
- 2.C語言函數的定義
- 3.C語言函數的參數和返回值
- 4.C語言函數的調用
- 5.C語言函數的嵌套調用
- 6.C語言函數的遞歸調用
- 7.C語言數組作為函數參數
- 8.C語言局部變量和全局變量
- 9.C語言變量的存儲類別
- 九. 預處理命令
- 1.C語言預處理概述
- 2.C語言無參數宏定義
- 3.C語言帶參數宏定義
- 4.C語言文件包含命令
- 5.C語言條件編譯詳解
- 6.C語言預處理指令總結
- 十. C語言指針
- 1.C語言指針的概念
- 2.C語言指針變量
- 3.C語言指針變量作為函數參數
- 4.C語言指針變量的運算
- 5.C語言數組指針
- 6.C語言通過指針引用數組
- 7.C語言數組名作函數參數
- 8.C語言指向多維數組的指針
- 9.C語言字符串指針
- 10.C語言字符串指針變量與字符數組的區別
- 11.C語言函數指針變量
- 12.C語言指針型函數
- 13.C語言指針數組的概念
- 14.C語言指向指針的指針
- 15.C語言main函數參數
- 16.關于指針的總結
- 十一. 結構體和共用體
- 1.C語言結構體的定義
- 2.C語言結構類型變量的說明
- 3.C語言結構變量成員的表示方法
- 4.C語言結構變量的賦值
- 5.C語言結構變量的初始化
- 6.C語言結構體數組的定義
- 7.C語言指向結構體變量的指針
- 8.C語言指向結構體數組的指針
- 9.C語言結構體指針變量作函數參數
- 10.C語言動態存儲分配
- 11.C語言鏈表的概念
- 12.C語言枚舉類型
- 13.C語言類型定義符typedef
- 十二. 位運算
- 1.C語言位運算符詳解
- 2.C語言位域(位段)
- 3.關于位運算的總結
- 十三. 文件操作
- 1.C語言文件概述
- 2.C語言文件指針
- 3.C語言文件的打開與關閉
- 4.C語言文件的讀寫
- 5.C語言文件的隨機讀寫
- 6.C語言文件檢測函數
- 7.C語言庫文件(頭文件)有哪些
- 8.文件操作小結