關於C語言的指針(3)數據交互過程

關於C語言的指針(3):

指針與函數、數據的交換過程

函數調用者與函數之間交換數據的方式有三種:傳統值傳遞,全局變量和指針變量間接引用,不同只要體現在函數的密封性和數據交換方便性的方面。

  1. 傳統數值傳遞方式:
    函數調用者通過向函數參數賦值完成像函數輸入數據的過程,函數通過返回值完成想函數調用這輸出數據的過程,由於函數參數和函數內部變量與函數調用者內部變量與調用者的內部變量之間是相互獨立的,因此,在執行過程中,對函數參數和函數中其他內部變量的引用和賦值操作對函數調用這是透明的。
    函數調用者通過向函數參數賦值完成像函數輸入數據的過程,函數通過返回值完成想函數調用這輸出數據的過程,由於函數參數和函數內部變量與函數調用者內部變量與調用者的內部變量之間是相互獨立的,因此,在執行過程中,對函數參數和函數中其他內部變量的引用和賦值操作對函數調用這是透明的。
    這種數據交換的方式的好處是是想了函數的封閉性,函數的調用者只能通過像函數參數賦值實現函數調用這至函數的單向數據輸入過程,函數只能通過調用函數返回數值實現函數到函數調用這的單向數據輸出過程。

  2. 全局變量
    全局變量由於可以被函數調用這和函數共享,因此,函數調用者和函數之間可以通過該全局變量實現數據的交換過程,函數調用這對全局變量的操作結果直接影響函數引用的全局變量的數值,同樣,函數對全局變量的操作結果直接影響函數調用者引用的全局變量的數值。
    由於C語言沒有限定定義的全局變量的數量,函數調用者和函數之間可以通過全局變量完成交換過程,但交換過程的函數調用者和函數之間定義的接口無關,函數調用者和函數之間沒有固定的輸入輸出接口。

  3. 指針變量間接引用方式
    雖然函數參數和函數內部變量與函數調用的內部變量之
    間是相互獨立的,但是如果函數參數是指針變量,且函數調用這通過數值傳遞方式將函數調用內部變量的地址複製給函數參數,韓式可以通過間接訪問過程改變作爲函數參數的指針變量所指向的存儲單元的內容,應因此改變函數次奧用着內部變量的數值,實現指針變量間接引用的過程:

過程步驟如下:
1、函數參數是指針變量,
2、函數調用這通過數值傳遞將函數調用這內部變量的地址複製給函數參數、
3、函數執行中通過間接訪問過程完成對函數調用者內部變量的操作。
這樣通過指針變量間接引用方式可以實現函數調用這和函數之間大量數據交換的過程,也可以收到接口控制,是平衡以上兩種方式的辦法。

指針與數組

可以使用整形表達式的結果作爲數組的下標,有利於數組適用於循環結構,但數組的特性是間接訪問,指向數組的指針用於存儲指向數組的指針,這一類型的指針變量的定義過程與只想數據的指針變量的定義過程不同。

指針和一維數組

間接訪問數組元素

對於一維數組和指針變量的定義過程:
一維數組和指針
數組名稱表示指向本數組中的第一個數組元素的指針,數值是分配給數組的地址連續的一組存儲單元中第一個存儲的單元的地址。
數組名稱爲X表示的指針作爲初數值賦值給制定變量p,
則P,P+1,P+2分別是指向數組元素X[0],X[1],X[2]的指針,
*P,*P+1,P+2分別是數組元素X[0],X[1],X[2]的數值
其中類型爲int的唯一數組名X表示指向類型爲int的數組元素的指針,可以將其賦值給類型爲int的指針變量,X+1的數值等於X+1
sizeof(int)。

數組名座位函數參數

如果函數調用者需要將整個傳遞給函數,在定義函數的時候需要指針變量作爲參數,函數體通過對作爲參數的指針變量的間接訪問完成對數組中各個數組元素的操作過程,
如果通過指針賦值將分配給某個數組的地址連續的一組存儲單元中的第一個存儲單元的地址作爲數值傳遞給函數中的參數,函數有三種定義方式:

  1. void fun1(int X[],int) { int i; for (i=0;i<n;i++) x[i]=i; }
  2. void fun2(int *p,int n) { int i; for (i=0;i<n;i++) *(p+i)=i; }
  3. void fun3(int *p,int n) { int i; for(i=0;i<n;i++) p[i]=i; }
    這三種定義的過程是相同的,主函數main的調用方式是:
main()
{
	int x[3],*p=&x[0];
	fun1(x,3);
	fun2(x,3);
	fun3(x,3);
	fun1(p,3);
	fun2(p,3);
	fun3(p,3);
}

調用的過程相同,所以函數調用者可以將數組名稱或者數組元素的地址賦值給函數中的以數組名或者指針變量標識的參數。
需要注意的是在定義函數的時候,無論是數組名韓式指針變量作爲參數,編譯器都將其作爲指針變量處理,所以函數a[3],a[],a只是形式不同,本質是一樣的都是a。

之後將結合題目嘗試二維數組和指針

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