關於函數調用時形參與實參的情況

關於函數調用時形參與實參的情況

首先什麼是形參與實參

形式參數:定義函數時函數名後括號中的變量名!
實際參數:調用函數時函數名後括號中的表達式!

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有關

所以大家在函數中應注意地址改變與數值改變區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章