【C++】详解形参和实参:别再傻傻分不清
一、基本定义与本质区别
形参(形式参数) 是函数定义时声明的参数,位于函数名后的括号中,用于接收调用时传递的数据。例如:
代码语言:javascript
AI代码解释
// x和y就是形参
int max(int x, int y) {
return x > y ? x : y;
}
形参只在函数内部有效,相当于函数内的局部变量,只有当函数被调用时才会分配内存,函数执行结束后立即释放。
实参(实际参数) 是函数调用时传递给函数的具体数据,可以是常量、变量、表达式或函数返回值。例如:
代码语言:javascript
AI代码解释
int a = 10, b = 20;
// 以下几种都是实参的合法形式
max(5, 8); // 常量作为实参
max(a, b); // 变量作为实参
max(a + 3, min(b, 25)); // 表达式和函数返回值作为实参
实参必须具有确定的值,在函数调用时会将这些值传递给形参。
二、参数传递的三种方式
C/C++ 中参数传递主要有三种方式,每种方式对实参的影响各不相同:
1. 值传递(默认方式)
值传递时,编译器会为形参分配内存,并将实参的值复制一份给形参。这意味着形参和实参是完全独立的两个变量,修改形参不会影响实参。
代码语言:javascript
AI代码解释
void increment(int num) {
num++; // 仅修改形参
cout << "函数内:" << num << endl; // 输出11
}
int main() {
int a = 10;
increment(a);
cout << "函数外:" << a << endl; // 仍然输出10
return 0;
}
值传递的优点是安全,避免函数意外修改外部变量;缺点是对于大型数据结构,复制操作会影响性能。
2. 地址传递(指针传递)
当形参是指针类型时,传递的是实参的地址。这时通过指针间接访问可以修改实参的值:
代码语言:javascript
AI代码解释
void increment(int* num) {
(*num)++; // 通过指针修改实参
cout << "函数内:" << *num << endl; // 输出11
}
int main() {
int a = 10;
increment(&a); // 传递a的地址
cout << "函数外:" << a << endl; // 输出11
return 0;
}
指针传递本质上还是值传递,只是传递的是地址值。这种方式常用于需要修改实参或传递大型数据结构(避免复制开销)的场景。
3. 引用传递(C++ 特有)
引用是变量的别名,声明时必须初始化且不能更改指向。引用传递时,形参相当于实参的别名,操作形参就是直接操作实参:
代码语言:javascript
AI代码解释
void increment(int& num) { // &表示引用
num++; // 直接修改实参
cout << "函数内:" << num << endl; // 输出11
}
int main() {
int a = 10;
increment(a); // 直接传递变量
cout << "函数外:" << a << endl; // 输出11
return 0;
}
引用传递在语法上比指针更简洁,同时保留了指针传递的效率,是 C++ 中推荐的方式
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)