讲解C语言形参与实参

形参与实参

C语言中的形参(形式参数)和实参(实际参数)是函数传递数据时的重要概念。理解它们的类型和所占字节数有助于更好地掌握C语言的函数调用机制。

1. 形参和实参

  • 形参(形式参数) :函数定义时在括号中的参数,起到占位作用。例如:

    c 复制代码
    void func(int a, float b) {
        // a 和 b 是形参
    }
  • 实参(实际参数) :调用函数时传入的具体值或变量。例如:

    c 复制代码
    int x = 5;
    float y = 3.14;
    func(x, y);  // x 和 y 是实参

2. 形参和实参的类型

C语言支持不同类型的形参和实参,常见类型有:

  • 基本数据类型 :如int、float、char等
  • 指针类型 :如int*、float*等
  • 数组类型:数组作为形参时,会被转换为指向数组首元素的指针。
  • 结构体类型:结构体作为形参时,可以通过值传递或指针传递。

3. 类型与字节数

在C语言中,不同数据类型的变量占用的内存字节数是不同的。这个字节数和平台相关,通常情况下的常见类型及其占用字节数如下:

基本数据类型:

  • int :通常占用 4字节(在大多数平台上)
  • float :通常占用 4字节
  • double :通常占用 8字节
  • char :占用 1字节
  • short :通常占用 2字节
  • long :通常占用 4字节(在某些系统上,可能是8字节)

指针类型:

  • int* 、float* 、char* 等指针类型的字节数通常是平台相关的,通常在32位系统中指针占 4字节 ,在64位系统中指针占 8字节。

结构体类型:

  • 结构体的字节数取决于其中包含的成员的类型及对齐要求。对齐规则可能导致结构体的实际字节数比简单的成员大小总和更大。

例如,假设有一个结构体:

c 复制代码
struct Person {
    char name[20];  // 20字节
    int age;        // 4字节
};

这个结构体可能占 24字节(因为有可能发生字节对齐,填充4字节对齐规则,导致结构体的实际大小可能是24字节)。

4. 形参和实参的传递方式

C语言中,函数传递参数的方式有两种:

  • 值传递(pass by value):实参的值传递给形参,函数内修改形参的值不会影响实参。
  • 引用传递(pass by reference):通过指针传递实参的地址,函数内可以修改实参的值。

5. 举例说明

值传递:

c 复制代码
#include <stdio.h>

void func(int a) {
    a = 10;  // 修改形参a的值
}

int main() {
    int x = 5;
    func(x);  // 传递x的值
    printf("x = %d\n", x);  // 输出x = 5,x的值未改变
    return 0;
}

引用传递:

c 复制代码
#include <stdio.h>

void func(int* a) {
    *a = 10;  // 通过指针修改实参
}

int main() {
    int x = 5;
    func(&x);  // 传递x的地址
    printf("x = %d\n", x);  // 输出x = 10,x的值已改变
    return 0;
}

在引用传递中,实际传递的是变量的地址,因此函数可以修改实参的值。

总结

  • 形参 是在函数定义时使用的变量,而实参是在调用函数时传递的值。
  • 基本数据类型 (如int、char、float等)有固定的字节数,通常依赖于平台(32位或64位)来决定指针类型和结构体大小。
  • C语言传递参数时有值传递和引用传递两种方式,不同的方式会影响内存的使用和函数行为。
相关推荐
ACP广源盛139246256732 小时前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
芯祥联4 小时前
STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比
c语言·stm32·单片机·嵌入式硬件·网络协议·开源·broker
Escalating_xu13 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
阿钱真强道14 小时前
20 嵌入式操作系统 | ubus:把自己的程序状态暴露出去
c语言·进程通信·ubus·ubusd·blobmsg
小小龙学IT16 小时前
三菱 PLC MC 协议(SLMP / QnA 兼容 3E 帧)深度解析:从帧结构到 C++/Go 双语言采集实战
c语言·c++·golang
Logic10116 小时前
C语言/数据结构位运算题解:异或XOR找出游戏速通中的“独特初始能量值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Chen—LSN17 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
木由里予17 小时前
GDB 使用手册(详细版)
c语言·vscode
Chen—LSN18 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
Escalating_xu19 小时前
【C 语言】深入理解指针(2):数组名、数组传参、二级指针与指针数组
java·c语言·开发语言