91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言函數的知識點有哪些

發布時間:2022-04-21 14:38:23 來源:億速云 閱讀:114 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言函數的知識點有哪些”,在日常操作中,相信很多人在C語言函數的知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言函數的知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、初探程序中的函數

函數的概念

  • 函數是具有特定功能的程序部件(可當黑盒使用)

  • 函數有明確的使用方式(固定輸入對應固定輸出)

  • 函數在程序中可重復使用(程序中的工具)

函數的類型

  • 數據處理(數據→數據)

通過某種規則將 x處理成 y,如: y = 2x +1

  • 過程定義(數據→功能)

(根據數據)執行一系列動作,進而完成某種功能,如:屏幕打印

C語言中函數的組成部分

函數名:函數的唯一標識

函數參數定義:數據輸入(數據→數據,數據→動作)

函數返回類型:

  • 數據輸出(數據→數據)

  • 無返回值(數據→動作)

廣義函數示例:

返回類型 函數名(參數1,參數2)
{
    程序語句1;
    程序語句2;
    ......;
    程序語句n;
}

C語言中的函數示例

C語言函數的知識點有哪些

函數的調用

  • 通過函數名調用已經定義好的函數

  • 函數調用時需要依次指定函數參數的具體值

  • 函數調用的結果(返回值)可保存在同類型的變量中

下面看一段函數調用的代碼:

#include <stdio.h>
int func_demo( int x )
{
    int y = 0;
    y = 2 * x  - 1;
    return y;
}
int main()
{
    int r1 = func_demo(1);
    int r2 = func_demo(5);
    int r3 = func_demo(10);
    printf("r1 = %d\n", r1);
    printf("r2 = %d\n", r2);
    printf("r3 = %d\n", r3);
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

下面再看一段編寫函數計算累加和的代碼:

#include <stdio.h>
int sum (int n)
{
    int r = 0;
    int i = 0;
    for(i=1; i<=n; i++)
    {
        r += i;
    }
    return r;
}
int main()
{
    int o[10] = {10, 20, 30, 40, 50, 100};
    int r[10];
    int i = 0;
    for(i=0; i<10; i++)
    {
        r[i] = sum(o[i]);
    }
    for(i=0; i<10; i++)
    {
        printf("sum(%d) = %d\n", o[i], r[i]);
    }
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

采用數組可以便捷的求出從1加到指定的數。

小結

  • 函數是具有特定功能的程序部件

  • 函數由函數名,參數,返回類型以及函數體組成

  • 通過函數名調用已經定義好的函數,并同時傳入參數值

  • 函數的本質就是可重復利用的代碼段

二、深入淺出函數調用

再論C語言程序的入口

  • 一般情況下,C語言程序從main()開始執行

深入理解main()

  • main() 是應用程序與操作系統的一個“約定”

  • 當操作系統運行應用程序時,首先調用的就是 main() 函數

  • 應用程序必須運行于操作系統,接受操作系統管理

應用程序的運行

C語言函數的知識點有哪些

應用程序運行流程

下面看一段代碼,實際感受一下吧:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("Hello World!\n");
    system("pause");
    return 0;
}

沒錯,就是這個簡單的不能再簡單的代碼,打開Test.exe,得到下圖:

C語言函數的知識點有哪些

下面來證明一下 返回值 0 是返回給操作系統,首先打開命令提示符,如下:

C語言函數的知識點有哪些

然后在命令提示符上切換到這個目錄,采用 cd 命令,如下:

C語言函數的知識點有哪些

然后運行 Test.exe,如下:

C語言函數的知識點有哪些

按下回車,輸入echo %errorlevel%,如下:

C語言函數的知識點有哪些

可以看到輸出 0 ,這是 main 函數中的返回值。如果把 return 0那里換成 return 666,那么運行 echo %errorlevel% 會輸出 666。這就說明返回值成功返回給操作系統。

核心本質

  • C程序由一系列不同功能的函數構成

  • 函數之間通過相互調用組合“小功能”構成“大功能”

  • 整個C程序的功能由函數的組合調用完成

工具包的本質

  • 工具包就是函數集,包含了一系列定義好的函數

  • #include 語句用于聲明需要使用工具包中的函數

  • 工具包中的函數由其它開發者通過C語言編寫

  • 也可根據項目需要自行編寫私有工具包

小結

  • main() 是C程序中的入口函數(第一個被調用的函數)

  • main() 函數被操作系統調用(返回值也傳給操作系統)

  • 工具包的本質是一個函數集合

  • 可以根據需要自行定義工具包(函數集)

三、函數定義細節剖析

函數定義與函數調用

函數在被調用前必須完整定義

函數可以先被聲明,再被定義

  • 聲明時,必須給出函數三要素(函數名,參數列表,返回類型)

  • 定義時,必須完整給出函數體定義

特殊的基礎類型

  • C語言中存在空類型(void),這種類型表示“空”

  • void 不能用于定義具體變量(沒有任何數據屬于空類型)

  • void 常用于函數定義,表示無返回值或無參數

void 深入理解

  • void 是基礎類型,但不是基礎數據類型,無法定義變量

  • void可用于函數參數,表示函數無參數

  • void 可用于函數返回類型,表示函數無返回值

所以說,下面程序的寫法就是錯誤的。

#include <stdio.h>
void demo(void i)
{
    return i;
}
int main()
{
    void v;
    void x = v;
    demo(x);
    return 0;
}

注意事項

C語言中的函數如果確定不需要參數,那么用 void 定義參數,而不是不寫參數。

#include <stdio.h>
void f( )
{
    printf("void f() \n");
}
void g(void)
{
    printf("void g() \n");
}
int main()
{
    f();
    f(1, 2);
    g();
//    g(1);   // ERROR
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

可以看出,f 函數的輸入參數是沒有限制的,而g 函數沒有輸入參數,這點要特別注意。

關于函數返回

return 語句直接返回主調函數,后續代碼不再執行

對于無返回值函數

  • return 可以直接使用,無需跟上返回值

  • 當函數體中沒有 return 語句時,最后一條語句執行后自動返回

對于有返回值的函數

  • return 必須跟上一個合法返回值,所有執行分支都必須顯示返回值

  • return 語句必須出現在函數體中,并且必須被執行

小結

  • 函數可以先被聲明,再被定義(調用前必須給出完整定義)

  • C語言中存在空類型(void) ,這種類型表示“空”

  • void是基礎類型,但不是基礎數據類型

  • return語句直接返回主調函數,后續代碼不再執行

  • 函數中的所有執行分支必須存在return語句

四、函數參數深度剖析

深入函數參數

  • 函數參數在函數定義時并沒有確定的值(形參)

  • 函數參數的具體值在函數調用時指定(實參)

  • 函數參數的本質是變量

  • 函數調用時指定的實參用于對形參進行初始化,初始化之后形參在函數內部等同于普通變量。

下面看一段代碼:

#include <stdio.h>
int test(int n);
int main()
{
    int i = 3;
    int j = test(i);
    printf("i = %d, j = %d\n", i, j);
    return 0;
}
int test(int n)
{
    n = n * 10;
    return n;
}

下面為輸出結果:

C語言函數的知識點有哪些

特殊的數組參數

  • 可以在定義函數時使用數組形參(如: int f( int a[5] );)

  • 數組形參需要使用同類型數組作為實參

  • 在C語言中,數組作為函數參數傳遞時大小信息丟失

  • 在函數內部修改數組形參,將影響數組實參

注意事項

  • 數組形參已經發生退化,不包含數組大小信息

  • 示例:void func (int a[ ]) 等價于void func (int a[1]) 等價于void func (int a[10]) 等價于void func (int a[100])

下面看一段代碼,加深印象:

#include <stdio.h>
void demo(int a[3])
{
    a[0] = 50;
}
int sum(int a[], int len)
{
    int ret = 0;
    int i = 0;
    while( i < len )
    {
        ret += a[i];
        i++;
    }
    return ret;
}
int main()
{
    int arr1[5] = {0, 1, 2, 3, 4};      // arr1[0] -> 0
    int arr2[10] = {0, 10, 20, 30, 40}; // arr2[0] -> 0
    demo(arr1);
    demo(arr2);
    printf("arr1[0] = %d\n", arr1[0]);
    printf("arr2[0] = %d\n", arr2[0]);
    printf("sum(arr1) = %d\n", sum(arr1, 5));
    printf("sum(arr2) = %d\n", sum(arr2, 10));
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

這里注意一下這句話:在函數內部修改數組形參,將影響數組實參,所以當調用 demo 函數后,實參的 arr1[0] 和 arr2[0] 都變成了50。

小結

  • 函數定義時參數沒有具體值,函數調用時指定參數初始值

  • 函數參數在函數內部等同于普通變量

  • 在C語言中,數組作為函數參數傳遞時大小信息丟失

  • 在函數內部修改數組形參,將影響數組實參

  • 在C語言中,數組作為函數參數傳遞時大小信息丟失在函數內部修改數組形參,將影響數組實參

五、編寫函數對數組排序

排序的一般定義

  • 排序是計算機內經常進行的一種操作,其目的是將一組“無序”的數據元素調整為“有序”的數據元素。

排序中的關鍵操作

比較

  • 任意兩個數據元素通過比較操作確定先后次序

交換

  • 數據元素之間需要交換才能得到預期結果

核心思想

  • 每次(例如第i次,i = O,1,..., n-2) 從后面 n-i 個待排的數據元素中選出最小元素,作為第 i 個元素。

解決方案

編寫函數 int Min(int a[], int b, int e) 選擇最小元素

  • 功能定義:在數組 a 的 b ...e ] 范圍尋找最小元素

  • 返回值:最小元素在數組中的下標

循環遍歷數組,將每次找到的最小元素交換就位

下面看一下示例代碼:

#include <stdio.h>
int Min(int a[], int b, int e)
{
    int r = b;
    int i = 0;
    for(i=b; i<=e; i++)
        if( a[r] > a[i] )
            r = i;
    return r;
}
void Sort(int a[], int n)
{
    int i = 0;
    int j = 0;
    int k = 0;
    for(i=0; i<n; i++)
    {
        j = Min(a, i, n-1);
        if( i != j )
        {
            k = a[i];
            a[i] = a[j];
            a[j] = k;
        }
    }
}
void Print(int a[], int n)
{
    int i = 0;
    while( i < n )
        printf("%d ", a[i++]);
    printf("\n");
}
int main()
{
    int a[5] = {20, 30, 10, 40, 50};
    printf("Origin: \n");
    Print(a, 5);
    Sort(a, 5);
    printf("After: \n");
    Print(a, 5);
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

小結

  • 排序是將一組“無序”的數據調整為“有序”的數據

  • 排序中的關鍵操作為比較和交換

  • 排序時每次選擇未排序數據中的最小值,并交換就位

  • 每次選擇交換使得數據逐漸有序,最終完全有序

六、變量的作用域與生命期(上)

C語言中變量的分類

局部變量

  • 函數內部定義的變量(隸屬于當前函數)

  • 只能在當前函數中訪問使用

全局變量

  • 全局范圍內的變量(不特定隸屬于任意一個函數)

  • 可以在任意函數中訪問使用

同名變量的問題

  • 不同函數中的局部變量可以同名(不會產生沖突)

  • 全局變量不能同名(會產生命名沖突)

  • 當局部變量和全局變量同名時,優先使用局部變量

同名變量規則

  • 存在多個同名變量時,優先使用最近定義的變量。

下面看一段代碼,感受一下:

#include <stdio.h>
int var = 100;  // 全局變量
void f(int var) // var <==> 局部變量
{
    var++;
    printf("var = %d\n", var);
}
int main()
{
    int var = 10;  // 局部變量
    f(var);  // f(10);
    printf("var = %d\n", var);  // var = 10;
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

變量的作用域

  • 變量的作用域指的是變量定義后的可訪問范圍

  • 不同變量的作用域可以有重疊

  1. 不同名變量在重疊作用域內可分別訪問

  2. 在重疊作用域內,只可訪問最近定義的同名變量

局部變量的作用域

  • 代碼塊:從 { 開始到 } 結束的一段代碼

  • 變量只能定義在代碼塊的開始處,即: { 之后,執行語句之前

  • 變量的作用域從定義開始到當前代碼塊結束

  • 當變量的作用域結束后,變量不可用 (無法直接訪問)

全局變量的作用域

  • 全局作用域:可在程序的各個角落訪問并使用

  • 文件作用域:只能在當前代碼文件中訪問并使用

  • 全局作用域:可在程序的各個角落訪問并使用一文件作用域:只能在當前代碼文件中訪問并使用

  • 工程開發中,全局變量通常以 g_ 作為前綴命名(工程約定)

下面看一段代碼,感受一下:

#include <stdio.h>
int var = 100;  // 全局變量
int main()
{
    int var = 10;  // 局部變量
    {
        int var = 1;  // 局部變量
        printf("var = %d\n", var);
    }
    printf("var = %d\n", var);  // var = 10;
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

注意:存在多個同名變量時,優先使用最近定義的變量

小結

  • 局部變量只能在當前函數中使用,全局變量可在任何地方使用

  • 當局部變量和全局變量同名時,優先使用局部變量

  • 變量的作用域可重疊,內層作用域覆蓋外層作用域

  • 離開作用域后變量不可訪問(無法繼續使用)

七、變量的作用域與生命期(下)

不同變量的物理存儲區域

  • 在現代計算機系統中,物理內存被分為不同區域

  • 區域不同,用途不同,不同種類的變量位于不同區域

  1. 全局數據區:存放全局變量,靜態變量

  2. 棧空間:存放函數參數,局部變量

  3. 堆空間:用于動態創建變量

生命期:變量從創建到銷毀的時間(即:合法可用的時間)

不同變量的生命期

全局數據區中的變量

  • 程序開始運行時創建,程序結束時被銷毀,整個程序運行期合法可用

棧空間中的變量

  • 進入作用域時創建,離開作用域時銷毀(自動銷毀)

局部變量在函數調用返回后銷毀

下面看一段代碼,感受一下變量生命期:

#include <stdio.h>
int var = 1;
void func()
{
    printf("var = %d\n", var);
}
int main()
{
    int var = 2;
    int i = 0;
    for(i=0; i<5; i++)
    {
        int var = 4;
        var += i;
        printf("var = %d\n", var);
    }
    func();
    printf("var = %d\n", var);
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

這個例子充分展示了變量的生命周期,值得仔細體會。

作用域與生命期無本質聯系

作用域規則是語法層面對變量是否可訪問的規定

生命期是二進制層面上變量存在于內存中的時間

可能的情況

  • 作用域外無法訪問的變量,可能在其生命期中(靜態局部變量)

  • 作用域內可訪問的變量,可能已經被銷毀(堆變量)

  • 生命期中的變量,可能無法訪問(文件作用域全局變量)

靜態變量

  • static 是C語言中的關鍵字

  • static 修飾的局部變量創建于全局數據區(擁有程序生命期)

  • static 修飾的全局變量只有文件作用域(文件之外無法訪問)

  • static 局部變量只會初始化一次,作用域與普通變量無異

變量的生命期由變量存儲位置決定

  • static 將變量存儲于全局數據區,默認初始化為0

  • auto 將變量存儲于棧空間,默認初始化為隨機值

  • register 將變量存儲于寄存器,默認初始化為隨機值

不同類型變量示例

#include <stdio.h>
int g_var = 1;
static int g_sVar = 2;
int main()
{
    static int s_var = 3;
    auto int v = 4;
    register int rv = 5;
    printf("g_var = %d\n", g_var);
    printf("g_sVar = %d\n", g_sVar);
    printf("s_var = %d\n", s_var);
    printf("v     = %d\n", v);
    printf("rv    = %d\n", rv);
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

下面看一段代碼,感受一下 static 關鍵詞:

#include <stdio.h>
int global;
int func(int x)
{
    static int s_var;   // 全局數據區中的變量,默認初始化為 0
                        // 并且,只做一次初始化
    s_var += x;
    return s_var;
}
int main()
{
    int i = 0;
    for(i=1; i<=5; i++)
    {
        printf("func(%d) = %d\n", i, func(i));
    }
    printf("func(0) = %d\n", func(0));
    printf("global = %d\n", global);
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

這里注意:全局數據區中的變量,默認初始化為 0 ,并且,只做一次初始化

小結

  • 變量生命期指變量合法可用的時間

  • 生命期是變量存在于內存中的時間

  • 作用域與生命期無本質聯系

  • 作用域和生命期用于判斷變量是否可訪問

 staticauto(默認)register
局部變量全局數據區棧空間寄存器(可能)
全局變量全局數據區------

八、函數專題練習

題目:編寫函數,將字符串轉換為整型數

函數原型:int str2int(char s[]);

參數:可以代表整型數的字符串

返回值:整型值

注意事項:

  • 整型數可以存在符號位,如: "-12345"

  • 字符串本身可能不是一個合法整型數,如:"123xyz45"

算法流程

C語言函數的知識點有哪些

上代碼:

#include <stdio.h>
int getNumber(char c)
{
    int ret = -1;
    if( ('0' <= c) && (c <= '9') )
        ret = c - '0';
    return ret;
}
int str2int(char str[])
{
    int ret = 0;
    int sign = 0;
    int i = 0;
    if( getNumber(str[0]) != -1 )
    {
        sign = 1;
        i = 0;
    }
    else if( str[0] == '+' )
    {
        sign = 1;
        i = 1;
    }
    else if( str[0] == '-' )
    {
        sign = -1;
        i = 1;
    }
    while( sign && str[i] )
    {
        int n = getNumber(str[i]);
        if( n != -1 )
            ret = ret * 10 + n;
        else
            break;
        i++;
    }
    ret = sign * ret;
    return ret;
}
int main()
{
    printf("%d\n", str2int("123"));
    printf("%d\n", str2int("-12345"));
    printf("%d\n", str2int("567xyz89"));
    printf("%d\n", str2int("abc"));
    printf("%d\n", str2int("-xyz"));
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

九、遞歸函數簡介

在程序設計中,將函數自調用稱為遞歸調用

遞歸是一種數學上分而自治的思想

  • 將原問題分解為規模較小的問題進行處理

  • 問題的分解是有限的(遞歸不能無限進行)

遞歸模型的一般表示法

C語言函數的知識點有哪些

遞歸在程序設計中的應用

遞歸函數

  • 函數體中存在自我調用的函數

  • 遞歸函數必須有遞歸出口(邊界條件)

  • 函數的無限遞歸將導致程序崩潰

遞歸思想的應用:

自然數列求和:sum( n ) = 1 +2 +3 + ... + n

C語言函數的知識點有哪些

斐波拉契數列:1,1,2,3,5,8,13,21,...

C語言函數的知識點有哪些

上代碼:

#include <stdio.h>
int sum(int n)
{
    int ret = 0;
    if( n == 1 )
        ret = 1;
    else
        ret = n + sum(n-1);
    return ret;
}
int fac(int n)
{
    int ret = 0;
    if( n == 1 )
        ret = 1;
    else if( n == 2 )
        ret = 1;
    else if( n >= 3 )
        ret = fac(n-1) + fac(n-2);
    else
        ret = -1;
    return ret;
}
int main()
{
    int i = 0;
    printf("sum(1) = %d\n", sum(1));
    printf("sum(10) = %d\n", sum(10));
    printf("sum(100) = %d\n", sum(100));
    for(i=1; i<=10; i++)
    {
        printf("%d, ", fac(i));
    }
    printf("\n");
    return 0;
}

下面為輸出結果:

C語言函數的知識點有哪些

到此,關于“C語言函數的知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河曲县| 罗平县| 绥江县| 泰宁县| 阿坝| 大方县| 同德县| 绥德县| 凯里市| 崇义县| 于田县| 遵义市| 林口县| 乌鲁木齐县| 五家渠市| 余干县| 红原县| 女性| 济阳县| 汉源县| 乡宁县| 垫江县| 西畴县| 铜川市| 河东区| 孟村| 新源县| 托克逊县| 略阳县| 习水县| 鹤峰县| 广昌县| 霍城县| 台山市| 溧水县| 乌海市| 大邑县| 罗田县| 客服| 仙桃市| 巴彦淖尔市|