C 中形參類型詳解與實(shí)例分析
緒論在C 編程中,函數(shù)的形參可以分為非引用形參和引用形參,其中非引用形參包括非const形參和const形參。非const形參以實(shí)參的副本初始化,不會(huì)修改實(shí)參的值;而引用形參直接訪問實(shí)參對(duì)象并可以
緒論
在C 編程中,函數(shù)的形參可以分為非引用形參和引用形參,其中非引用形參包括非const形參和const形參。非const形參以實(shí)參的副本初始化,不會(huì)修改實(shí)參的值;而引用形參直接訪問實(shí)參對(duì)象并可以改變實(shí)參內(nèi)容。通過使用const限定符,可以對(duì)這兩種形參進(jìn)行更精確的控制。
非const非引用形參
對(duì)于普通的函數(shù)形參來說,以實(shí)參副本初始化形參將改變實(shí)參的值。然而,在非const非引用形參中,無論實(shí)參是否添加const關(guān)鍵字,結(jié)果都是一樣的。這是因?yàn)榉莄onst非引用形參本身不會(huì)改變實(shí)參的值。
```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非引用形參中,防止修改從實(shí)參傳遞的形參值,因此只能使用形參而不能修改形參。和非const非引用形參類似,對(duì)于實(shí)參添加const與否結(jié)果相同。
```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引用形參直接關(guān)聯(lián)到綁定對(duì)象,對(duì)形參的修改就是對(duì)實(shí)參的修改。通常在需要在函數(shù)中修改實(shí)參值或以大型對(duì)象作為實(shí)參傳遞時(shí)會(huì)使用非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實(shí)參初始化,也可以傳遞右值或需要類型轉(zhuǎn)換的對(duì)象,但是不可修改其值。實(shí)參添加const與否對(duì)結(jié)果沒有影響。
```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;
}
```
總結(jié)
- 非const非引用形參和const非引用形參均可由const或非const實(shí)參初始化;
- 非const引用形參沒有const限定符,實(shí)參必須是非const類型;
- const引用形參可由const或非const實(shí)參初始化;
- 非const引用形參在使用上不夠靈活,通常建議少用非const引用形參,多用const引用形參。
程序?qū)嵗?/p>
以下為一個(gè)完整的程序示例,展示不同類型的形參的使用和限制。
```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對(duì)象的指針
cout << *p1 << " " << *p2 << endl;
system("pause");
return 0;
}
```
通過以上的文章內(nèi)容和代碼示例,我們可以更好地理解C 中各種形參類型的差異和應(yīng)用場(chǎng)景。