1. 程式人生 > >c 函式引數(總結)

c 函式引數(總結)

函式引數為兩種:形式引數和實際引數

1.形式引數

形參出現在被調函式當中,在整個函式體內都可以使用。形參在定義時編譯系統並不分配儲存空間,只有在呼叫該函式時才分配記憶體單元。呼叫結束記憶體單元被釋放,故形參只有在函式呼叫時有效,呼叫結束時不能再使用。

2.實際引數

實參出現在主調函式當中,當函式呼叫時,主調函式把實參的值傳送給被調函式的形參,從而實現函式間的資料傳遞。傳遞方式有兩種:值傳遞和地址傳遞方式。
引數傳遞: 引數傳遞首先要搞清楚是 值傳遞還是地址傳遞,這是極為重要的。若為值傳遞是不能改變實際變數的值是單向傳遞而 地址傳遞則是雙向改變的。
一.值傳遞:

1. 當形參定義為變數時,實參可以是常量、變數和表示式,這種函式間的引數傳遞為值傳遞方式。值傳遞的特點是引數的“單向傳遞” 並不會改變a,b的值。
#include<stdio.h>
void myswap(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}
int main()
{
    int a, b;
    printf("Please enter two integers to be exchanged.:");
    scanf("%d %d", &a, &b);
    myswap(a,b);  //作為對比,直接交換兩個整數,顯然不行
    printf("The result of calling the exchange function:%d 和 %d\n", a, b);
    return 0;
}

2 .陣列元素作為函式引數。 陣列元素也為值傳遞:
int swap(int a,int b)
{
   int temp;
   temp=a;
   a=b;
   b=temp;
   return 0;
}  
int main (void){
		int a[]={3,4};
		swap(a[0],b[0]);
	}
二.地址傳遞。

1.陣列名作為函式引數也傳的是地址。 2. 陣列指標,即陣列元素的地址作為函式引數
int swap(int *a,int *b)
{
   int temp;
   temp=*a;
   *a=*b;
   *b=temp;
   return 0;
}  
int main (void){
		int arr[] = {1,2};
		int *a = &arr[0];
	    	int *b = &arr[1];
			swap(a,b);
	}
3.直接傳入地址。
#include<stdio.h>
void myswap(int &x, int &y)
{
    int t;
    t=x;
    x=y;
    y=t;
}

int main()
{
    int a, b;
    printf("Please enter two integers to be exchanged:");
    scanf("%d %d", &a, &b);
    myswap(a,b);  //直接以變數a和b作為實參交換
    printf("The result of calling the exchange function:%d 和 %d\n", a, b);
    return 0;
}