C 中形參類型詳解與實例分析
緒論在C 編程中,函數(shù)的形參可以分為非引用形參和引用形參,其中非引用形參包括非const形參和const形參。非const形參以實參的副本初始化,不會修改實參的值;而引用形參直接訪問實參對象并可以
緒論
在C 編程中,函數(shù)的形參可以分為非引用形參和引用形參,其中非引用形參包括非const形參和const形參。非const形參以實參的副本初始化,不會修改實參的值;而引用形參直接訪問實參對象并可以改變實參內(nèi)容。通過使用const限定符,可以對這兩種形參進行更精確的控制。
非const非引用形參
對于普通的函數(shù)形參來說,以實參副本初始化形參將改變實參的值。然而,在非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引用形參直接關聯(lián)到綁定對象,對形參的修改就是對實參的修改。通常在需要在函數(shù)中修改實參值或以大型對象作為實參傳遞時會使用非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;
}
```
通過以上的文章內(nèi)容和代碼示例,我們可以更好地理解C 中各種形參類型的差異和應用場景。