c语言 形参和实参
时间: 2025-05-25 16:12:02 浏览: 30
### C语言中形参与实参的概念及区别
#### 一、形参与实参的定义
在C语言中,函数调用时涉及两个重要概念——形参(形式参数)和实参(实际参数)。
- **形参**是指在函数声明或定义时使用的变量名,用于接收外部传入的数据。这些变量仅存在于函数内部,在函数执行完毕后会被销毁[^1]。
- **实参**是在调用函数时传递给函数的具体数据值或表达式。它通常是一个已知的变量或者常量。
例如:
```c
#include <stdio.h>
void func(int x) {
printf("Value inside function: %d\n", x);
}
int main() {
int a = 5;
func(a); // 调用func函数并传递a作为实参
return 0;
}
```
在此代码片段中,`x` 是形参,而 `a` 则是实参[^2]。
---
#### 二、形参与实参的类型及其内存占用
C语言支持多种类型的参数传递,包括但不限于基本数据类型、指针类型以及结构体类型等。每种类型都有其特定的字节大小和用途:
1. **基本数据类型**
基本数据类型如 `int`, `float`, `char` 等具有固定的存储空间需求。例如,`int` 类型一般占据 4 字节(具体取决于编译器环境),而 `char` 占据 1 字节[^1]。
2. **指针类型**
指针是一种特殊的变量,用来保存另一个变量的地址。无论指针指向何种类型的数据,它的本身大小通常是相同的(比如在大多数现代架构下为 8 字节)。通过指针可以实现对原始数据的操作[^3]。
3. **结构体类型**
结构体允许将不同类型的数据组合在一起形成复合数据类型。当作为一个整体传递时,整个结构体会被复制到对应的形参位置上[^1]。
---
#### 三、形参与实参的传递方式
C语言提供了两种主要的参数传递方法:**值传递** 和 **引用传递**。
1. **值传递**
当采用值传递的方式时,会将实参的内容拷贝一份副本交给形参使用。这意味着即使修改了形参也不会影响原实参的值[^3]。
示例:
```c
#include <stdio.h>
void modifyValue(int num) {
num *= 2; // 修改的是num的一个本地副本
printf("Inside Function: %d\n", num);
}
int main() {
int value = 10;
modifyValue(value);
printf("After Call: %d\n", value); // 输出仍为原来的value
return 0;
}
```
2. **引用传递**
如果希望函数能够直接影响实参,则可以通过指针来间接访问该对象。此时传递的是指向实参的指针而非其实质内容。
示例:
```c
#include <stdio.h>
void modifyByPointer(int* ptrNum) {
(*ptrNum) *= 2; // 解引用操作符(*)作用于ptrNum所指向的位置
printf("Modified Inside Func via Pointer: %d\n", *ptrNum);
}
int main() {
int number = 7;
modifyByPointer(&number); // 将address-of(number)发送过去
printf("Final Value After Modification Using Pointers: %d\n", number);
return 0;
}
```
---
#### 四、总结
综上所述,理解和区分好形参与实参对于编写高效可靠的程序至关重要。需要注意的关键点有以下几个方面:
- 形参只在其所属的作用域范围内有效;
- 实参决定了最终如何初始化相应的形参;
- 不同情况下可以选择不同的传递策略以满足功能需求。
---
阅读全文
相关推荐

















