天天看點

C語言指針之形參和實參

C語言中的形參&實參

變量:

當你聲明一個變量時候,系統會給你配置設定一塊記憶體,這個記憶體也會有一個位址;

不論是全局變量還是局部變量,作用域和生命周期可能不一樣外,隻有類型的不一樣,别基本屬性是一樣的,就是一個變量;

也沒有所謂的指針變量,隻是這個變量的類型是個指針而已,他也是配置設定一塊記憶體,有自己的位址,長度是int,隻是他的資料是某塊的位址;

是以你要是想通過參數修改資料,隻能傳入該變量的位址,然函數體取到對應的位址,對地質内的資料操作,如果隻傳入變量,相當于就是函數體的局部變量,作用域在該函數體内,函數體結束時,生命周期結束;

//一下是網絡收集的資料輔助了解;

記住這條基本原理:形參相當于函數中定義的變量,調用函數傳遞參數的過程相當于定義形參變量并且用實參的值來初始化。例如這樣調用:

void print_time(int hour, int minute) { printf("%d:%d\n", hour, minute); } int main(void) { int h = 23, m = 59; print_time(h, m); return 0; }

相當于在函數print_time中執行了這樣一些語句:

int hour = h; int minute = m; printf("%d:%d\n", hour, minute);

main函數的變量h和print_time函數的參數hour是兩個不同的變量,隻不過它們的存儲空間中都儲存了相同的值23,因為變量h的值賦給了參數hour。同理,變量m的值賦給了參數minute。C語言的這種傳遞參數的方式稱為Call by Value。在調用函數時,每個參數都需要得到一個值,函數定義中有幾個形參,在調用時就要傳幾個實參,不能多也不能少,每個參數的類型也必須對應上。

在定義函數中指定的形參,在未出現函數調用時,他們并不占記憶體中的存儲單元。隻有在發生函數調用時,函數max中的形參才被配置設定記憶體單元。在調用結束後,形參所占的記憶體單元也被釋放。

實參可以是常量、變量和表達式,但要求有确定的值。在調用時将實參的值賦給形參。

在C語言中,實參向形參的資料傳遞是值傳遞,單向傳遞,隻由實參傳給形參,而不能由形參傳給實參。在記憶體中,實參單元和形參單元是不同的單元。在調用函數時,給形參配置設定存儲單元,并将實參對應的值傳遞給形參,調用結束後,形參單元被釋放,實參單元仍保留原值。

指針變量作函數參數也要遵循這一規則。不可能通過調用函數來改變實參變量的值,但可以改變實參指針變量所指變量的值。

函數的形參和實參具有以下特點:

1.形參變量隻有在被調用時才配置設定記憶體單元,在調用結束時, 即刻釋放所配置設定的記憶體單元。是以,形參隻有在函數内部有效。 函數調用結束傳回主調函數後則不能再使用該形參變量。

2.實參可以是常量、變量、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有确定的值, 以便把這些值傳送給形參。 是以應預先用指派,輸入等辦法使實參獲得确定值。

3.實參和形參在數量上,類型上,順序上應嚴格一緻, 否則會發生“類型不比對”的錯誤。

4.函數調用中發生的資料傳送是單向的。 即隻能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 是以在函數調用過程中,形參的值發生改變,而實參中的值不會變化。

#include <stdio.h>

#include <string.h>

void swap_a(int a ,int b)

{

a ^= b;

b^= a;

a^=b;

}

void swap(int *a,int*b)

{

*a = 20;

*b = 10;

}

int main()

{

int a=10 ;

int b = 20;

int x = 10;

int y = 20;

swap_a(x,y);

swap(&a,&b);//

printf("a:%d,b:%d,x:%d,y:%d",a,b,x,y);

getchar();

return 0;

}

結果:a:20,b:10,x:10,y:20

分析:swap(x,y)形式參數,可以了解為該函數的局部變量,調用結束記憶體釋放,實參可以傳遞給形參,形參不可以傳遞給實參;

swap(&a,&b);實參為位址,*a = 20;*b =10;該函數處理的是位址,即使子函數釋放所有記憶體,位址上的值已經變化,是以可以傳出來,,

以上案例,是自己總結

繼續閱讀