C 中形参类型详解与实例分析
绪论
在C 编程中,函数的形参可以分为非引用形参和引用形参,其中非引用形参包括非const形参和const形参。非const形参以实参的副本初始化,不会修改实参的值;而引用形参直接访问实参对象并可以改变实参内容。通过使用const限定符,可以对这两种形参进行更精确的控制。
非const非引用形参
对于普通的函数形参来说,以实参副本初始化形参将改变实参的值。然而,在非const非引用形参中,无论实参是否添加const关键字,结果都是一样的。这是因为非const非引用形参本身不会改变实参的值。
```cpp
include
include
using namespace std;
int use_ptr1(int val) {
return val;
}
int main() {
int v1 1;
cout << "v1初值: " << v1 << endl;
use_ptr1(v1);
cout << "v1加1操作后: " << v1 << endl;
const int v2 2;
cout << "v2初值: " << v2 << endl;
use_ptr1(v2);
cout << "v2加1操作后: " << v2 << endl;
getchar();
return 0;
}
```
const非引用形参
在const非引用形参中,防止修改从实参传递的形参值,因此只能使用形参而不能修改形参。和非const非引用形参类似,对于实参添加const与否结果相同。
```cpp
include
include
using namespace std;
int use_ptr2(const int val) {
return val;
}
int main() {
int v1 1;
use_ptr2(v1);
cout << "v1: " << v1 << endl;
const int v2 2;
use_ptr2(v2);
cout << "v2: " << v2 << endl;
getchar();
return 0;
}
```
非const引用形参
非const引用形参直接关联到绑定对象,对形参的修改就是对实参的修改。通常在需要在函数中修改实参值或以大型对象作为实参传递时会使用非const引用形参。
```cpp
include
include
using namespace std;
int use_ptr5(int val) {
return val;
}
int main() {
int v1 1;
int *p1 v1;
use_ptr5(v1);
cout << "v1: " << v1 << endl;
getchar();
return 0;
}
```
const引用形参
const引用形参可以由非const或const实参初始化,也可以传递右值或需要类型转换的对象,但是不可修改其值。实参添加const与否对结果没有影响。
```cpp
include
include
using namespace std;
int use_ptr6(const int val) {
return val;
}
int main() {
int v1 1;
int v2 2;
use_ptr6(v1);
use_ptr6(v2);
getchar();
return 0;
}
```
总结
- 非const非引用形参和const非引用形参均可由const或非const实参初始化;
- 非const引用形参没有const限定符,实参必须是非const类型;
- const引用形参可由const或非const实参初始化;
- 非const引用形参在使用上不够灵活,通常建议少用非const引用形参,多用const引用形参。
程序实例
以下为一个完整的程序示例,展示不同类型的形参的使用和限制。
```cpp
include
include
using namespace std;
int use_ptr1(int val) {
return val;
}
int use_ptr2(const int val) {
return val;
}
void ptrswap1(int *s1, int *s2) {
int *temp s2;
s2 s1;
s1 temp;
}
void ptrswap2(const int *s1, const int *s2) {
const int *temp s2;
s2 s1;
s1 temp;
}
int main() {
int v1 1, v2 2;
int *p1 v1;
int *p2 v2;
ptrswap1(p1, p2);
cout << *p1 << " " << *p2 << endl;
const int *p3 v1;
const int *p4 v2;
// ptrswap2(p3, p4); // Error: 不能传入指向const对象的指针
cout << *p1 << " " << *p2 << endl;
system("pause");
return 0;
}
```
通过以上的文章内容和代码示例,我们可以更好地理解C 中各种形参类型的差异和应用场景。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。