最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中形參和實參的區(qū)別小結

 更新時間:2025年12月18日 09:53:56   作者:kaf_1  
本文介紹了C語言中形參和實參的區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本文介紹了C語言中形參和實參的核心概念。形參是函數(shù)定義中的參數(shù),在調用時分配內存并接收實參的值;實參則是函數(shù)調用時傳入的具體值或表達式。C語言默認采用傳值調用機制,通過指針可實現(xiàn)傳址調用。文章還詳細講解了數(shù)組、結構體、函數(shù)指針等不同類型的參數(shù)使用方法,以及const參數(shù)保護、可變參數(shù)等高級特性,并通過示例代碼展示了各種參數(shù)傳遞方式的實際效果。

C語言中的形參和實參

一、核心定義

形參 (Formal Parameter)

  • 定義:函數(shù)聲明或定義時括號內的參數(shù)
  • 內存分配:函數(shù)調用時在棧上分配內存
  • 特點:是局部變量,只在函數(shù)內部有效
  • 初始化:被實參初始化

實參 (Actual Argument)

  • 定義:函數(shù)調用時傳入的具體值或表達式
  • 特點:必須有確定的值
  • 位置:函數(shù)調用時出現(xiàn)在括號內

二、基礎示例

#include <stdio.h>

// 函數(shù)定義 - a, b 是形參
int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5, y = 3;
    
    // 函數(shù)調用 - x, y 是實參
    int result = add(x, y);
    printf("結果: %d\n", result);  // 輸出: 8
    
    // 直接使用常量或表達式作為實參
    result = add(10, 20);          // 常量實參
    printf("結果: %d\n", result);  // 輸出: 30
    
    result = add(x, y * 2);        // 表達式作為實參
    printf("結果: %d\n", result);  // 輸出: 11
    
    return 0;
}

三、C語言的參數(shù)傳遞機制

1.傳值調用 (Call by Value)- C語言的默認方式

#include <stdio.h>

void swap_by_value(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    printf("函數(shù)內: a=%d, b=%d\n", a, b);
}

int main() {
    int x = 10, y = 20;
    printf("交換前: x=%d, y=%d\n", x, y);
    
    swap_by_value(x, y);  // 只傳遞值的副本
    
    printf("交換后: x=%d, y=%d\n", x, y);  // 原值未改變!
    return 0;
}

輸出:

交換前: x=10, y=20
函數(shù)內: a=20, b=10
交換后: x=10, y=20  // 原值未變!

2.傳址調用 (Call by Address)- 使用指針

#include <stdio.h>

void swap_by_address(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 10, y = 20;
    printf("交換前: x=%d, y=%d\n", x, y);
    
    swap_by_address(&x, &y);  // 傳遞地址
    
    printf("交換后: x=%d, y=%d\n", x, y);  // 原值改變了!
    return 0;
}

3.數(shù)組作為參數(shù)- 實際傳遞的是指針

#include <stdio.h>

// 數(shù)組作為參數(shù)(實際是指針)
void print_array(int arr[], int size) {  // int arr[] 等價于 int *arr
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void modify_array(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;  // 會修改原數(shù)組
    }
}

int main() {
    int nums[] = {1, 2, 3, 4, 5};
    int size = sizeof(nums) / sizeof(nums[0]);
    
    printf("原數(shù)組: ");
    print_array(nums, size);
    
    modify_array(nums, size);
    
    printf("修改后: ");
    print_array(nums, size);  // 數(shù)組內容已改變
    
    return 0;
}

四、不同類型的參數(shù)

1. 基本數(shù)據(jù)類型參數(shù)

#include <stdio.h>

// 各種基本類型參數(shù)
void process_basic_types(int i, float f, double d, char c) {
    printf("整型: %d\n", i);
    printf("浮點: %.2f\n", f);
    printf("雙精度: %.4lf\n", d);
    printf("字符: %c\n", c);
}

2. 指針參數(shù)

#include <stdio.h>
#include <string.h>

// 字符串處理(使用字符指針)
void string_operations(char *str) {
    printf("字符串: %s\n", str);
    printf("長度: %zu\n", strlen(str));
    
    // 修改字符串內容
    str[0] = toupper(str[0]);
}

// 多級指針
void allocate_memory(int **ptr, int size) {
    *ptr = (int *)malloc(size * sizeof(int));
    if (*ptr != NULL) {
        for (int i = 0; i < size; i++) {
            (*ptr)[i] = i * 10;
        }
    }
}

3. 結構體參數(shù)

#include <stdio.h>

// 結構體定義
typedef struct {
    int x;
    int y;
} Point;

// 傳值 - 傳遞整個結構體的副本
void print_point_by_value(Point p) {
    printf("點坐標: (%d, %d)\n", p.x, p.y);
    p.x = 100;  // 只修改副本
}

// 傳址 - 傳遞結構體指針
void modify_point_by_address(Point *p) {
    p->x += 10;
    p->y += 10;
}

// 返回結構體
Point create_point(int x, int y) {
    Point p = {x, y};
    return p;
}

4. 函數(shù)指針參數(shù)

#include <stdio.h>

// 回調函數(shù)類型定義
typedef int (*CompareFunc)(int, int);

int max(int a, int b) {
    return (a > b) ? a : b;
}

int min(int a, int b) {
    return (a < b) ? a : b;
}

// 使用函數(shù)指針作為參數(shù)
int compare_and_process(int a, int b, CompareFunc func) {
    return func(a, b);
}

int main() {
    int result;
    
    result = compare_and_process(10, 20, max);
    printf("較大值: %d\n", result);  // 20
    
    result = compare_and_process(10, 20, min);
    printf("較小值: %d\n", result);  // 10
    
    return 0;
}

五、參數(shù)的高級特性

1. const參數(shù)(保護數(shù)據(jù)不被修改)

#include <stdio.h>

// const保護指針指向的數(shù)據(jù)
void print_string(const char *str) {
    // str[0] = 'A';  // 錯誤!不能修改const數(shù)據(jù)
    while (*str) {
        putchar(*str++);
    }
}

// const保護指針本身
void process_array(int *const arr, int size) {
    // arr = NULL;  // 錯誤!不能修改指針本身
    for (int i = 0; i < size; i++) {
        arr[i] += 1;  // 可以修改指向的數(shù)據(jù)
    }
}

2. 可變參數(shù)(stdarg.h)

#include <stdio.h>
#include <stdarg.h>

// 可變參數(shù)函數(shù)
int sum_variable_args(int count, ...) {
    int total = 0;
    va_list args;          // 參數(shù)列表
    va_start(args, count); // 初始化
    
    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);  // 獲取下一個int參數(shù)
    }
    
    va_end(args);          // 清理
    return total;
}

int main() {
    printf("總和: %d\n", sum_variable_args(3, 10, 20, 30));  // 60
    printf("總和: %d\n", sum_variable_args(5, 1, 2, 3, 4, 5));  // 15
    return 0;
}

3. 參數(shù)默認值(C語言不支持,但可用宏模擬)

// 使用宏模擬默認參數(shù)
#define PRINT_MESSAGE(msg, count) print_message_impl(msg, count)

void print_message_impl(const char *msg, int count) {
    for (int i = 0; i < count; i++) {
        printf("%s\n", msg);
    }
}

// 使用重載宏
#define PRINT_MESSAGE_1(msg) PRINT_MESSAGE(msg, 1)
#define PRINT_MESSAGE_2(msg, count) PRINT_MESSAGE(msg, count)

六、重要注意事項

1. 數(shù)組參數(shù)的大小信息丟失

void process(int arr[]) {  // 等價于 int *arr
    // sizeof(arr) 返回的是指針大小,不是數(shù)組大??!
    // 必須額外傳遞數(shù)組大小參數(shù)
}

2. 參數(shù)的求值順序

int i = 0;
printf("%d, %d, %d\n", i, ++i, i++);  // 未定義行為!不同編譯器結果不同

3. 寄存器變量參數(shù)(register關鍵字)

// 建議編譯器將參數(shù)放入寄存器(C17起已廢棄,但可了解)
void fast_function(register int x, register int y) {
    // 這些參數(shù)可能存儲在寄存器中,訪問更快
}

七、完整示例程序

#include <stdio.h>
#include <stdlib.h>

// 結構體定義
typedef struct {
    char name[50];
    int age;
    float score;
} Student;

// 函數(shù)聲明
void print_student(const Student *s);
void update_score(Student *s, float new_score);
Student create_student(const char *name, int age, float score);

int main() {
    // 創(chuàng)建學生結構體
    Student stu = create_student("張三", 20, 85.5);
    
    // 傳址調用,可以修改原結構體
    printf("修改前:\n");
    print_student(&stu);
    
    update_score(&stu, 90.0);
    
    printf("\n修改后:\n");
    print_student(&stu);
    
    return 0;
}

// 函數(shù)定義
Student create_student(const char *name, int age, float score) {
    Student s;
    snprintf(s.name, sizeof(s.name), "%s", name);
    s.age = age;
    s.score = score;
    return s;  // 返回結構體(C語言支持結構體返回)
}

void print_student(const Student *s) {
    printf("姓名: %s\n", s->name);
    printf("年齡: %d\n", s->age);
    printf("分數(shù): %.1f\n", s->score);
}

void update_score(Student *s, float new_score) {
    s->score = new_score;  // 直接修改原結構體
}

八、最佳實踐總結

  1. 明確傳遞意圖

    • 不需要修改的參數(shù):使用const修飾
    • 需要修改的參數(shù):使用指針傳遞
  2. 數(shù)組參數(shù)

    • 總是同時傳遞數(shù)組和大小
    • 使用const保護不想被修改的數(shù)組
  3. 結構體參數(shù)

    • 小結構體:傳值(簡單安全)
    • 大結構體:傳址(高效)
    • 需要修改的結構體:必須傳址
  4. 參數(shù)驗證

    void safe_divide(int numerator, int denominator) {
        if (denominator == 0) {
            fprintf(stderr, "錯誤:分母不能為零\n");
            return;
        }
        // 安全操作...
    }
    
  5. 文檔說明

    /*
     * 函數(shù):calculate_average
     * 參數(shù):scores - 分數(shù)數(shù)組(不能為NULL)
     *        count - 數(shù)組元素個數(shù)(必須大于0)
     * 返回:平均分,如果出錯返回-1
     */
    float calculate_average(const float *scores, int count);
    

理解形參和實參是掌握C語言函數(shù)編程的基礎,特別是理解C語言嚴格的傳值機制和通過指針實現(xiàn)的傳址效果,這是與許多其他語言的重要區(qū)別。

對于數(shù)組與函數(shù)調用來說,實參與形參格式不同,實參只需要給出定義名稱即可

到此這篇關于C語言中形參和實參的區(qū)別小結的文章就介紹到這了,更多相關C語言 形參和實參內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望

相關文章

  • C++與C的差異分析

    C++與C的差異分析

    這篇文章主要介紹了C++與C的差異分析,非常實用,需要的朋友可以參考下
    2014-08-08
  • 詳解C++中mutable的用法

    詳解C++中mutable的用法

    這篇文章主要介紹了詳解C++中mutable的用法,幫助大家更好的理解和學習C++,感興趣的朋友可以了解下
    2020-08-08
  • C語言常用庫函數(shù)的使用及模擬實現(xiàn)詳解例舉

    C語言常用庫函數(shù)的使用及模擬實現(xiàn)詳解例舉

    C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個文件里,供程序員使用,下面讓我們一起來詳細了解它
    2022-04-04
  • Qt?5.9使用VTK顯示點云的詳解詳解

    Qt?5.9使用VTK顯示點云的詳解詳解

    這篇文章主要介紹了Qt?5.9使用VTK顯示點云,主要包括PCL安裝及在VS2013中使用PCL的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C語言編程大小端問題示例詳解教程

    C語言編程大小端問題示例詳解教程

    這篇文章主要為大家介紹了C語言編程大小端問題解決的示例內容詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Qt 添加MSVC2017編譯器的完整教程(保姆級)

    Qt 添加MSVC2017編譯器的完整教程(保姆級)

    本文主要介紹了Qt 添加MSVC2017編譯器的完整教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • C語言實現(xiàn)實時鐘表

    C語言實現(xiàn)實時鐘表

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)實時鐘表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言中隨機數(shù)rand()函數(shù)詳解

    C語言中隨機數(shù)rand()函數(shù)詳解

    大家好,本篇文章主要講的是C語言中隨機數(shù)rand()函數(shù)詳解,感興趣的同學感快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 詳解C語言中函數(shù)宏的三種封裝方式

    詳解C語言中函數(shù)宏的三種封裝方式

    函數(shù)宏,即包含多條語句的宏定義,其通常為某一被頻繁調用的功能的語句封裝,且不想通過函數(shù)方式封裝來降低額外的彈棧壓棧開銷。本文就來聊聊函數(shù)宏的三種封裝方式吧
    2023-03-03
  • 詳解C語言未初始化的局部變量是多少

    詳解C語言未初始化的局部變量是多少

    這篇文章主要給大家介紹了關于C語言未初始化的局部變量是多少,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07

最新評論

荆州市| 延川县| 昌黎县| 乌拉特后旗| 从化市| 饶平县| 四会市| 分宜县| 新巴尔虎左旗| 嘉祥县| 库尔勒市| 广德县| 张北县| 北川| 永康市| 汉中市| 馆陶县| 榆林市| 新竹县| 阿尔山市| 玛多县| 蚌埠市| 班戈县| 河北区| 鄂伦春自治旗| 洮南市| 庆云县| 峨眉山市| 长白| 称多县| 泽普县| 曲水县| 宜川县| 五峰| 唐山市| 大渡口区| 郓城县| 金乡县| 巴彦淖尔市| 阿鲁科尔沁旗| 华池县|