形参和实参的比较

博客介绍了函数形参和实参的概念,形参用于函数内部,实参在主调函数中。函数调用时数据传送单向,只能实参传值给形参,改变形参不影响实参。还说明了传非指针和指针时形参、实参的变化情况,并提供代码用于实验思考。

1、形参出现在函数定义中,在整个函数体内部都可以使用,离开该函数则不能使用。实参出现在主调函数中,主调函数中调用一个函数时,函数名后面括号中的参数称为实参。

2、函数调用中发生的数据传送是单向的,只能把实参的值传送给形参,但改变形参的值并不可以改变实参的值

3、如果在调用函数的过程中传给函数的不是指针,在被调用函数运行时,形参和实参是不同的变量,它们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变;如果在调用函数的过程中传给函数的是指针,调用后指针形参会改变实参的对象,但依然不会改变实参。
以下提供代码供实验及思考:
Test:
再在用函数的过程中传给函数的不是指针

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

void GetMemory(char *p){
    p = (char *)malloc(100*sizeof(char));
    if(p == NULL){
        printf("Failed to apply memory\n");
    }
}

int main(void){
    char *str = NULL;

    GetMemory(str);//再在用函数的过程中传给函数的不是指针
    strcpy(str,  "hello world");

    printf("%s\n", str);

    free(str);
    str = NULL;

    return 0;
}

Test1:
在调用函数的过程中传给函数的是指针

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

void GetMemory(char **p){
    *p = (char *)malloc(100*sizeof(char));
    if(*p == NULL){
        printf("Failed to apply memory\n");
    }
}

int main(void){
    char *str = NULL;

    GetMemory(&str);//在调用函数的过程中传给函数的是指针
    strcpy(str,  "hello world");

    printf("%s\n", str);
    free(str);
    str = NULL;

    return 0;
}
<think> 嗯,用户想了解形参实参的定义。根据之前提供的引用内容,需要系统化整理这两个核心概念的区别联系。 首先查看引用[1]的表述:形参是函数定义时的占位符,实参是函数调用时传递的实际值。这个描述很清晰,突出了两者的时空差异——形参存在于函数定义阶段,实参存在于调用阶段。 引用[3]的示例很生动,说明当调用Max(a,b)时,ab是实参,而函数定义里的xy是形参。这里特别注意到实参可以是变量/常量/表达式,但必须具有确定值。 引用[2]虽然针对Java,但原理相通,强调形参本质是"接收容器",实参是"传递内容"。这个容器比喻很象,准备在回答时采用。 用户可能存在的潜在疑问是:为什么需要区分这两者?考虑在回答中加入"类比快递"的例子:形参就像订单预留的收件人信息栏(空容器),实参则是实际填写的收货地址(具体内容)。这样能帮助理解参数传递的抽象过程。 注意到三个引用都强调值传递特性——形参作为实参的独立副本存在。这点很重要,需要明确说明修改形参不影响实参,这是很多初学者容易混淆的点。 最后检查术语准确性:确保所有描述与引用[1][3]的C语言语境一致,避免混入引用[2]的Java特性。例如C语言严格使用"函数"而非Java的"方法"。 </think>形参实参是函数/方法调用中的核心概念,它们的定义区别如下: ### 📌 形参式参数) 1. **定义位置**:函数/方法的**定义**中声明 2. **本质**:占位符(接收实参传递值的变量) 3. **生命周期**:函数调用时创建,函数结束时销毁 4. **作用**:定义函数所需数据的类型顺序 5. **示例**: ```c int add(int x, int y) { // x, y 是形参 return x + y; } ``` ### 📌 实参(实际参数) 1. **定义位置**:函数/方法的**调用**处提供 2. **本质**:传递给函数的实际数据(常量/变量/表达式) 3. **要求**:必须有确定的值 4. **作用**:为形参提供具体数据 5. **示例**: ```c int main() { int a = 3, b = 5; int sum = add(a, b); // a, b 是实参 } ``` ### 🔑 核心区别 | 特性 | 形参 | 实参 | |------------|--------------------------|--------------------------| | **存在阶段** | 函数定义时 | 函数调用时 | | **本质** | 数据接收容器(占位符) | 实际传递的数据 | | **是否必须**| 函数定义的必需部分 | 函数调用的必需部分 | ### ⚠️ 关键特性 1. **值传递机制**(C语言典型场景): ```c void modify(int num) { // num 是形参 num = 10; // 修改不影响实参 } int main() { int x = 5; modify(x); // x 是实参,值仍为5 } ``` - 形参实参的**独立副本**,修改形参**不影响**实参[^1][^3] 2. **匹配规则**: - 数量、顺序、类型必须严格匹配 - 例如 `add(3, "hello")` 会导致类型错误[^1][^3] > **类比理解**:形参如同快递单上的收件人信息栏(预留空位),实参是你实际填写的地址(具体数据)。调用函数时,系统将实参的值“复制”到形参的地址栏中完成数据传递。 --- ### ❓ 相关问题 1. 值传递引用传递对形参/实参的影响有何不同? 2. 在C++中如何通过引用形参修改实参的值? 3. 函数重载时形参列表如何决定调用哪个函数? 4. 默认参数在形参声明中如何工作? 5. 变长参数函数(如`printf()`)的形参如何声明? [^1]: 形参是函数定义时的占位符,用于接收从外部传入的值;实参是函数调用时传递给函数的实际值。 [^2]: 形参实参的核心区别在于定义位置作用。 [^3]: 实参可以是变量,常量,表达式,但必须是确定的值,调用时将值赋给形参
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值