關於函數調用時形參與實參的情況
首先什麼是形參與實參
形式參數:定義函數時函數名後括號中的變量名!
實際參數:調用函數時函數名後括號中的表達式!
1.形參未被調用時,不佔存儲單元。形參只在調用過程中佔用存儲單元。形參定義時必須指定類型!
2.實參是常量。變量或者表達式!要與形參類型一致!而且實參要有確定的值,佔用儲存單元,在調用過程中實參將值賦給形參!
3.C中實參對形參數據傳遞時時單向傳遞。在存儲單元中是不同的單元
三種情況
情況一
#include<stdio.h>
void swap(int p,int q) { //p,q爲形參
int temp = p;
p = q;
q = temp;
}
int main() {
int a,b;
scanf("%d%d",&a,&b);//a,b爲實參
swap(a,b);
printf("%d %d",a,b);
}
在上面第三條性質中實參對形參數據傳遞時時單向傳遞,在存儲單元中是不同的單元,所以在swap函數中並不能改變a,b的值
情況二
#include<stdio.h>
void swap(int *p,int *q) { //p,q爲形參
int temp = *p;
*p = *q;
*q = temp;
}
int main() {
int a,b;
scanf("%d%d",&a,&b);//a,b爲實參
swap(&a,&b);
printf("%d %d",a,b);
}
要想在swap函數裏改變a,b值則使用指針
情況三
#include<stdio.h>
void swap(int *p,int *q) { //p爲形參
printf("p = %d q = %d\n",p,q);
p = q;
printf("p = %d q = %d\n",p,q);
}
int main() {
int a,b;
scanf("%d%d",&a,&b);//a爲實參
swap(&a,&b);
printf("&a = %d &b = %d\n",&a,&b);
printf("a = %d b = %d\n",a,b);
}
大家先思考一下結果會是什麼,該情況是我們在函數實參與實參使用時經常出的BUG
注:(以上圖的地址爲例)在理解該情況實參與形參的指針與地址傳遞時
//在主函數開始swap函數傳入a,b地址
p = &a; //該操作使a與p變量公用一塊地址
q = &b; //該操作使b與q變量公用一塊地址
//在swap函數裏
p = q //使p與q公用一塊地址,而p已經不與a用一塊地址了,所以p的任何改變都與a無關,而與b有關
所以大家在函數中應注意地址改變與數值改變區別