1. 程式人生 > >C語言中函式的使用小記——掌握函式引數的傳遞方式

C語言中函式的使用小記——掌握函式引數的傳遞方式

1.概念:

函式是一個完成特定功能的程式碼模組,其程式程式碼獨立,通常要求有返回值,也可以是空值。

一般形式如下:<資料型別><函式名稱>(<形式引數說明>)

{

語句序列:

return[(<表示式>)];

}

其中:

<函式名稱>是一個識別符號,要求符合識別符號的命名規則:

<資料型別>是整個函式的返回值型別,如無返回值應該寫為void型;

<形式引數說明>是逗號","分隔的多個變數的說明形式,通常簡稱為形參;

大括弧對{<語句序列>},稱為函式體;

<語句序列>是大於等於零個語句構成的;

注意:在函式體中,表示式語句裡使用的變數必須事先已有說明,否則不能使用。

return[<表示式>]語句中表達式的值,要和函式的<資料型別>保持一致;

如函式的<資料型別>為void可以省略或者無表示式結果返回(即寫成return;)

2.函式之間的引數傳遞方式

1>複製傳遞方式

  複製傳遞方式是函式間傳遞資料常用的方式。呼叫函式將實參傳遞給被呼叫函式,被呼叫函式將建立同類型的形參並用實參初始化。即把實參賦給一個新的變數,把實參複製到新建形參的儲存區域中。採用複製傳遞方式傳遞資料,被呼叫函式不能訪問呼叫函式裡的實參。被呼叫函式處理的資料是複製到其形參的資料,因此,即使改變形參的值也不會影響實參的值,一旦被呼叫函式完成了其任務時,這些形參通常就釋放其佔用空間 。如下圖所示:

解釋:虛線箭頭是指將實參的資料拷貝給了形參變數,實參和形參是具有相同資料型別但儲存空間是不同的兩組空間。被呼叫函式處理的資料是複製到本地的資料,它不能改變改變呼叫函式中實參的值。

例題:任意輸入一段字串,程式執行完畢後即可分別輸出該段字串中所包括的大寫字母個數、小寫字母個數、數字個數、空格個數和其他字元個數。

#include <stdio.h>
int p[5]={};


int main()
{
    char str[300];
    int *C_count(char *m);
    printf("Please input the string:\n");
    gets(str);
    printf("Display the string:\n %s\n",str);
    C_count(str);
    printf("The caculated result is:\n");
    printf("Upper= %d Lower= %d Num= %d Space= %d Others= %d\n",p[0],p[1],p[2],p[3],p[4]);
    return 0;
}


int *C_count(char *m)
{


    while(*m!='\0')
    {
        if(*m>='A' && *m<='Z')
                    p[0]++;
        else if(*m>='a' && *m<='z')
                    p[1]++;
        else if(*m>='0' && *m<='9')
                    p[2]++;
        else  if(*m==' ')
                    p[3]++;
        else
                    p[4]++;
        m++;
    }
    return p;
    
}

執行結果如下:

[email protected]:~/yy$ ./1
Please input the string:
We are friends!!123
Display the string:
 We are friends!!123
The caculated result is:
Upper= 1 Lower= 11 Num= 3 Space= 2 Others= 2



2>地址傳遞方式

地址傳遞方式和複製傳遞方式正好相反,這種方式是將呼叫函式的引數本身傳給被呼叫函式。因此,被呼叫函式對形參的操作將直接誒改變實參的值。呼叫函式將實參的地址傳送給被呼叫函式,被呼叫函式將對該地址的目標操作,相當於對市場司本身的操作。按地址傳遞,實參為變數的地址,而形參為同類型的指標。

void Swap(double *x,double *y);//Swap函式宣告
int main()
{
double x1, x2;
x1=21.56;
x2=65.12;
Swap(&x1,&x2);//呼叫Swap函式,交換x1和x2的值
printf("x1=%.2f,x2=%.2f\n",x1,x2);
}
void Swap(double *x,*y)//實線x和y指向的目標
{
double temp;
temp = *x; *x = *y; *y = temp;
}
執行結果:
x1=65.12  x2=21.56


3>全域性變數

全域性變數就是在函式體外說明的變數,它們在程式中的每個函式裡都是可見的。實際上,全域性變數也是一種靜態型的變數。將它初始化為0.。全域性變數已經定義後就會在程式的任何地方可見。使用全域性變數傳遞資料的先後順序的不同會影響計算結果,應用順序不當將導致錯誤,這種方式儘量少用。

相關推薦

C語言指標變數作為函式引數和一般變數作為函式引數的區別

函式的引數不僅可以是整型、浮點型、字元型等資料,還可以是指標型別。它的作用是將一個變數的地址傳送到另一個函式中。 指標變數作為函式引數和一般變數作為函式引數是有區別的,對於這種區別初學者一般都很迷惑。下面我將就一個簡單的例子來說明一下它們的區別。看透以後也許也就不那麼疑惑了。

C語言變數名及函式名的命名規則與駝峰命名法

一、C語言變數名的命名規則:(可以字母,數字,下劃線混合使用) 1. 只能以字母或下劃線開始;2. 不能以數字開始;3. 一般小寫;4. 關鍵字不允許用(eg:int float=2//error  float 為保留字不允許用); 二、函式名的命名規則 1.見名知意;2.自定義函式函式名首字

C語言巨集定義和函式的取捨

原文連結:http://www.embedu.org/Column/Column177.htm 要寫好C語言,漂亮的巨集定義是非常重要的。巨集定義可以幫助我們防止出錯,提高程式碼的可移植性和可讀性等。 在軟體開發過程中,經常有一些常用或者通用的功能或者程式碼段,這些功能既可以寫成函式,也可以

C語言的輸入輸出函式(學習筆記)

文章目錄 c語言中的基本輸入與輸出函式 1.格式化輸入輸出函式 1.1printf()函式 1.2scanf()函式 2.非格式化的輸入輸出函式 2.1puts()和gets()函式

C語言學習及應用筆記之七:C語言的回撥函式及使用方式

  我們在使用C語言實現相對複雜的軟體開發時,經常會碰到使用回撥函式的問題。但是回撥函式的理解和使用卻不是一件簡單的事,在本篇我們根據我們個人的理解和應用經驗對回撥函式做簡要的分析。 1、什麼是回撥函式   既然談到了回撥函式,首先我們就要搞清楚什麼是回撥函式。在討論回撥函式之前,我們需要說明另一個概念,

C語言呼叫靜態庫函式和動態庫函式方式

C語言中呼叫動態庫函式的兩種方式 方式一.隱式呼叫 將動態庫的相關檔案拷貝到當前目錄下(lib、dll),然後新增以下程式碼,在程式中指定連線庫函式。 注意:第二個引數給出的是引入庫檔案(或稱“匯出庫檔案”),而不是dll。在程式執行過程中,lib將dll中需要用到的函式對映到對應的記憶

c語言的回撥函式

先來一段程式碼 #include<stdio.h> void show(void(*ptr)()){  (* ptr)();   } void show1(){ printf("hello world"); } void show2(){ printf("ni

C語言處理字串的函式

在C語言中有許多字串處理函式,在寫程式的時候常常想不起來或則不瞭解區別,今天就花點時間將這些函式做個總結,以便以後查詢使用。 一、輸入函式 scanf 與 scanf_s 函式 char buf[10] = { 0 }; scanf("%s",

C語言常用的庫函式

C語言中常用的標頭檔案如下: <assert.h> 斷言             <float.h> 浮點數運算 <locale.h> 本土化           <math.h> 數學函式 <signal.h>

c語言一些常用的函式

1.sscanf() char s[100]; scanf("%s", s); int v; sscanf(&s[1], "%d", &v); 輸入s :(112, 334)  輸入s

c語言格式化讀寫函式fscanf()和fprintf()

fscanf():從指定檔案中按指定格式讀入資料,並賦值給相應的變數 格式: fscanf(檔案指標,格式字串,輸出列表) e.g. fscanf(fp,"%d",&i) fscanf(fp,"%d %d",&

C語言的那些庫函式(持續更新

1.【exit()】        exit是在呼叫處強行退出程式,執行一次程式就結束。exit(0)表示正常退出。exit(1)表示異常退出,這個1是返回給作業系統的。無論是寫在main函式中,還是在其他函式中,都是程式退出。一般都是認為0是正常退出、其他數字是異常退出。所

C語言生產隨機數 rand()函式

一:如果你只要產生隨機數而不需要設定範圍的話,你只要用rand()就可以了:rand()會返回一隨機數值, 範圍在0至RAND_MAX 間。RAND_MAX定義在stdlib.h, 其

標準C語言的檔案操作函式的記憶體版

1. 初衷 專案需要,itron作業系統中實裝freetype+harfbuzz的字型引擎,但itron系統中沒有支援檔案系統! 所以只能將依賴庫中的libdatrie和libthai中的檔案操作換成記憶體版。 2. 程式碼 廢話不說,直接上程式碼。 #include

C語言使用extern修飾函式要注意(轉)

用extern修飾函式是表示被修飾的函式定義在當前檔案外,而該函式用extern宣告型別後就可以被當前檔案呼叫了。使用extern修飾某函式時,對該函式的呼叫是在連線階段才被處理的。下面我們看一段程式碼。 /*********************************************** *

C語言一些常用IO函式的總結

scanf()函式格式化讀入函式,採用轉換說明匹配 scanf()通過%的形式對資料進行讀入,可以一次讀入多個數據。scanf的實現依靠指標所以有如下兩條規則: 1、scanf()讀入基本資料型別時,需要在變數名前加&。 2、scanf()讀入字串陣列時,不需要加。

C語言的字串擷取函式及應用

/*======================================================== 子數整數 源程式名 num.??? (pas,c,cpp) 可執行檔名 num.exe 輸入檔名 num.in 輸出檔名 num.out 對於一個五位數a

c語言如何使用malloc()函式在堆上建立二維陣列

首先附程式碼: #include <stdio.h>#include <stdlib.h>main()  //建立5行6列的陣列{int ** p, i;p = (int **)malloc( sizeof(int*) * 5 );    //也可以

C語言庫文件的加載方式

部分函數 HA 靜態 區分 最大 靜態鏈接 open 返回函數 接收 Linux下使用庫有三種方式,靜態鏈接庫,動態鏈接庫和動態加載庫。 -靜態鏈接庫: 在編譯過程中,將所需要的庫文件生成a文件並直接鏈接到最終的可執行文件當中,所以相對來講,靜態方式生成的image大小最

python函式的四種引數傳遞方式

fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 直接將實參賦予行參,根據位置做匹配。 根據鍵值對的形式做實參與行