久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語言數(shù)組作為函數(shù)參數(shù)_C語言中文網(wǎng)

 yggzs2002 2016-04-18
數(shù)組可以作為函數(shù)的參數(shù)使用,,進行數(shù)據(jù)傳送,。

數(shù)組用作函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素(下標(biāo)變量)作為實參使用,;另一種是把數(shù)組名作為函數(shù)的形參和實參使用,。

數(shù)組元素作函數(shù)實參

數(shù)組元素就是下標(biāo)變量,它與普通變量并無區(qū)別,。 因此它作為函數(shù)實參使用與普通變量是完全相同的,,在發(fā)生函數(shù)調(diào)用時,把作為實參的數(shù)組元素的值傳送給形參,,實現(xiàn)單向的值傳送,。【例5-4】說明了這種情況,。

【例8-7】判別一個整數(shù)數(shù)組中各元素的值,,若大于0 則輸出該值,若小于等于0則輸出0值,。編程如下:
  1. #include <stdio.h>
  2.  
  3. void nzp(int v){
  4. if(v>0)
  5. printf('%d ',v);
  6. else
  7. printf('%d ',0);
  8. }
  9.  
  10. int main(void){
  11. int a[5],i;
  12. printf('input 5 numbers\n');
  13. for(i=0;i<5;i ){
  14. scanf('%d',&a[i]);
  15. nzp(a[i]);
  16. }
  17.  
  18. return 0;
  19. }
#include <stdio.h>

void nzp(int v){
    if(v>0)
        printf('%d ',v);
    else
        printf('%d ',0);
}

int main(void){
    int a[5],i;
    printf('input 5 numbers\n');
    for(i=0;i<5;i  ){
        scanf('%d',&a[i]);
        nzp(a[i]);
    }

    return 0;
}
本程序中首先定義一個無返回值函數(shù)nzp,,并說明其形參v為整型變量。在函數(shù)體中根據(jù)v值輸出相應(yīng)的結(jié)果,。在main函數(shù)中用一個for語句輸入數(shù)組各元素,,每輸入一個就以該元素作實參調(diào)用一次nzp函數(shù),即把a[i]的值傳送給形參v,,供nzp函數(shù)使用,。

數(shù)組名作為函數(shù)參數(shù)

用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實參有幾點不同,。

1) 用數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的形參變量的類型一致,,那么作為下標(biāo)變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。因此,,并不要求函數(shù)的形參也是下標(biāo)變量,。換句話說,對數(shù)組元素的處理是按普通變量對待的,。用數(shù)組名作函數(shù)參數(shù)時,,則要求形參和相對應(yīng)的實參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明,。當(dāng)形參和實參二者不一致時,,即會發(fā)生錯誤。

2) 在普通變量或下標(biāo)變量作函數(shù)參數(shù)時,,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元,。在函數(shù)調(diào)用時發(fā)生的值傳送是把實參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時,,不是進行值的傳送,,即不是把實參數(shù)組的每一個元素的值都賦予形參數(shù)組的各個元素。因為實際上形參數(shù)組并不存在,,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存,。那么,數(shù)據(jù)的傳送是如何實現(xiàn)的呢?在我們曾介紹過,,數(shù)組名就是數(shù)組的首地址,。因此在數(shù)組名作函數(shù)參數(shù)時所進行的傳送只是地址的傳送,也就是說把實參數(shù)組的首地址賦予形參數(shù)組名,。形參數(shù)組名取得該首地址之后,,也就等于有了實在的數(shù)組。實際上是形參數(shù)組和實參數(shù)組為同一數(shù)組,,共同擁有一段內(nèi)存空間,。


上圖說明了這種情形。圖中設(shè)a為實參數(shù)組,,類型為整型,。a占有以2000為首地址的一塊內(nèi)存區(qū)。b為形參數(shù)組名,。當(dāng)發(fā)生函數(shù)調(diào)用時,,進行地址傳送,把實參數(shù)組a的首地址傳送給形參數(shù)組名b,,于是b也取得該地址2000,。于是a,,b兩數(shù)組共同占有以2000為首地址的一段連續(xù)內(nèi)存單元。從圖中還可以看出a和b下標(biāo)相同的元素實際上也占相同的兩個內(nèi)存單元(整型數(shù)組每個元素占二字節(jié)),。例如a[0]和b[0]都占用2000和2001單元,,當(dāng)然a[0]等于b[0]。類推則有a[i]等于b[i],。

【例8-8】數(shù)組a中存放了一個學(xué)生5門課程的成績,,求平均成績。
  1. #include <stdio.h>
  2.  
  3. float aver(float a[5]){
  4. int i;
  5. float av,s=a[0];
  6. for(i=1;i<5;i )
  7. s=s a[i];
  8. av=s/5;
  9. return av;
  10. }
  11.  
  12. int main(void){
  13. float sco[5],av;
  14. int i;
  15. printf('\ninput 5 scores:\n');
  16. for(i=0;i<5;i )
  17. scanf('%f',&sco[i]);
  18. av=aver(sco);
  19. printf('average score is %5.2f',av);
  20. return 0;
  21. }
#include <stdio.h>

float aver(float a[5]){
    int i;
    float av,s=a[0];
    for(i=1;i<5;i  )
        s=s a[i];
    av=s/5;
    return av;
}

int main(void){
    float sco[5],av;
    int i;
    printf('\ninput 5 scores:\n');
    for(i=0;i<5;i  )
        scanf('%f',&sco[i]);
    av=aver(sco);
    printf('average score is %5.2f',av);
    return 0;
}
本程序首先定義了一個實型函數(shù)aver,,有一個形參為實型數(shù)組a,,長度為5。在函數(shù)aver中,,把各元素值相加求出平均值,,返回給主函數(shù)。主函數(shù)main 中首先完成數(shù)組sco的輸入,,然后以sco作為實參調(diào)用aver函數(shù),,函數(shù)返回值送av,最后輸出av值,。 從運行情況可以看出,,程序?qū)崿F(xiàn)了所要求的功能。

3) 前面已經(jīng)討論過,,在變量作函數(shù)參數(shù)時,,所進行的值傳送是單向的。即只能從實參傳向形參,,不能從形參傳回實參,。形參的初值和實參相同,而形參的值發(fā)生改變后,,實參并不變化,,兩者的終值是不同的。而當(dāng)用數(shù)組名作函數(shù)參數(shù)時,,情況則不同,。由于實際上形參和實參為同一數(shù)組,因此當(dāng)形參數(shù)組發(fā)生變化時,,實參數(shù)組也隨之變化,。當(dāng)然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實際情況來看,,調(diào)用函數(shù)之后實參數(shù)組的值將由于形參數(shù)組值的變化而變化,。為了說明這種情況,把【例5.4】改為【例5.6】的形式,。

【例8-9】題目同【例8.7】,。改用數(shù)組名作函數(shù)參數(shù),。
  1. #include <stdio.h>
  2.  
  3. void nzp(int a[5]){
  4. int i;
  5. printf('\nvalues of array a are:\n');
  6. for(i=0;i<5;i ){
  7. if(a[i]<0) a[i]=0;
  8. printf('%d ',a[i]);
  9. }
  10. }
  11.  
  12. int main(void){
  13. int b[5],i;
  14. printf('\ninput 5 numbers:\n');
  15. for(i=0;i<5;i )
  16. scanf('%d',&b[i]);
  17. printf('initial values of array b are:\n');
  18. for(i=0;i<5;i )
  19. printf('%d ',b[i]);
  20. nzp(b);
  21. printf('\nlast values of array b are:\n');
  22. for(i=0;i<5;i )
  23. printf('%d ',b[i]);
  24.  
  25. return 0;
  26. }
#include <stdio.h>

void nzp(int a[5]){
    int i;
    printf('\nvalues of array a are:\n');
    for(i=0;i<5;i  ){
        if(a[i]<0) a[i]=0;
        printf('%d ',a[i]);
    }
}

int main(void){
    int b[5],i;
    printf('\ninput 5 numbers:\n');
    for(i=0;i<5;i  )
        scanf('%d',&b[i]);
    printf('initial values of array b are:\n');
    for(i=0;i<5;i  )
        printf('%d ',b[i]);
    nzp(b);
    printf('\nlast values of array b are:\n');
    for(i=0;i<5;i  )
        printf('%d ',b[i]);

    return 0;
}
本程序中函數(shù)nzp的形參為整數(shù)組a,長度為5,。主函數(shù)中實參數(shù)組b也為整型,,長度也為5。在主函數(shù)中首先輸入數(shù)組b的值,,然后輸出數(shù)組b的初始值,。然后以數(shù)組名b為實參調(diào)用nzp函數(shù)。在nzp中,,按要求把負值單元清0,并輸出形參數(shù)組a的值,。 返回主函數(shù)之后,,再次輸出數(shù)組b的值。從運行結(jié)果可以看出,,數(shù)組b的初值和終值是不同的,,數(shù)組b的終值和數(shù)組a是相同的。這說明實參形參為同一數(shù)組,,它們的值同時得以改變,。

用數(shù)組名作為函數(shù)參數(shù)時還應(yīng)注意以下幾點:
①形參數(shù)組和實參數(shù)組的類型必須一致,否則將引起錯誤,。

②形參數(shù)組和實參數(shù)組的長度可以不相同,,因為在調(diào)用時,只傳送首地址而不檢查形參數(shù)組的長度,。當(dāng)形參數(shù)組的長度與實參數(shù)組不一致時,,雖不至于出現(xiàn)語法錯誤(編譯能通過),但程序執(zhí)行結(jié)果將與實際不符,,這是應(yīng)予以注意的,。

【例8.10】如把例8.9修改如下:
  1. #include <stdio.h>
  2.  
  3. void nzp(int a[8]){
  4. int i;
  5. printf('\nvalues of array aare:\n');
  6. for(i=0;i<8;i ){
  7. if(a[i]<0)a[i]=0;
  8. printf('%d ',a[i]);
  9. }
  10. }
  11.  
  12. int main(void){
  13. int b[5],i;
  14. printf('\ninput 5 numbers:\n');
  15. for(i=0;i<5;i )
  16. scanf('%d',&b[i]);
  17. printf('initial values of array b are:\n');
  18. for(i=0;i<5;i )
  19. printf('%d ',b[i]);
  20. nzp(b);
  21. printf('\nlast values of array b are:\n');
  22. for(i=0;i<5;i )
  23. printf('%d ',b[i]);
  24.  
  25. return 0;
  26. }
#include <stdio.h>

void nzp(int a[8]){
    int i;
    printf('\nvalues of array aare:\n');
    for(i=0;i<8;i  ){
        if(a[i]<0)a[i]=0;
        printf('%d ',a[i]);
    }
}

int main(void){
    int b[5],i;
    printf('\ninput 5 numbers:\n');
    for(i=0;i<5;i  )
        scanf('%d',&b[i]);
    printf('initial values of array b are:\n');
    for(i=0;i<5;i  )
        printf('%d ',b[i]);
    nzp(b);
    printf('\nlast values of array b are:\n');
    for(i=0;i<5;i  )
        printf('%d ',b[i]);

    return 0;
}
本程序與【例8.9】程序比,nzp函數(shù)的形參數(shù)組長度改為8,,函數(shù)體中,,for語句的循環(huán)條件也改為i<8。因此,,形參數(shù)組a和實參數(shù)組b的長度不一致,。編譯能夠通過,但從結(jié)果看,,數(shù)組a的元素a[5],、a[6]、a[7]顯然是無意義的,。

③在函數(shù)形參表中,,允許不給出形參數(shù)組的長度,,或用一個變量來表示數(shù)組元素的個數(shù)。例如,,可以寫為:
    void nzp(int a[])
或?qū)憺?br>     void nzp( int a[], int n )
其中形參數(shù)組a沒有給出長度,,而由n值動態(tài)地表示數(shù)組的長度。n的值由主調(diào)函數(shù)的實參進行傳送,。由此,,【例8-10】又可改為【例8-11】的形式。

【例8-11】
  1. #include <stdio.h>
  2.  
  3. void nzp(int a[],int n){
  4. int i;
  5. printf('\nvalues of array a are:\n');
  6. for(i=0;i<n;i ){
  7. if(a[i]<0) a[i]=0;
  8. printf('%d ',a[i]);
  9. }
  10. }
  11.  
  12. int main(void){
  13. int b[5],i;
  14. printf('\ninput 5 numbers:\n');
  15. for(i=0;i<5;i )
  16. scanf('%d',&b[i]);
  17. printf('initial values of array b are:\n');
  18. for(i=0;i<5;i )
  19. printf('%d ',b[i]);
  20. nzp(b,5);
  21. printf('\nlast values of array b are:\n');
  22. for(i=0;i<5;i )
  23. printf('%d ',b[i]);
  24.  
  25. return 0;
  26. }
#include <stdio.h>

void nzp(int a[],int n){
    int i;
    printf('\nvalues of array a are:\n');
    for(i=0;i<n;i  ){
        if(a[i]<0) a[i]=0;
        printf('%d ',a[i]);
    }
}

int main(void){
    int b[5],i;
    printf('\ninput 5 numbers:\n');
    for(i=0;i<5;i  )
        scanf('%d',&b[i]);
    printf('initial values of array b are:\n');
    for(i=0;i<5;i  )
        printf('%d ',b[i]);
    nzp(b,5);
    printf('\nlast values of array b are:\n');
    for(i=0;i<5;i  )
        printf('%d ',b[i]);

    return 0;
}
本程序nzp函數(shù)形參數(shù)組a沒有給出長度,,由n 動態(tài)確定該長度,。在main函數(shù)中,函數(shù)調(diào)用語句為nzp(b,,5),,其中實參5將賦予形參n作為形參數(shù)組的長度。

④多維數(shù)組也可以作為函數(shù)的參數(shù),。在函數(shù)定義時對形參數(shù)組可以指定每一維的長度,,也可省去第一維的長度。因此,,以下寫法都是合法的:
    int MA(int a[3][10])

    int MA(int a[][10]),。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多