C說話 指針變量作為函數參數詳解。本站提示廣大學習愛好者:(C說話 指針變量作為函數參數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話 指針變量作為函數參數詳解正文
在C說話中,函數的參數不只可所以整數、小數、字符等詳細的數據,還可所以指向它們的指針。用指針變量作函數參數可以將函數內部的地址傳遞到函數外部,使得在函數外部可以操作函數內部的數據,而且這些數據不會跟著函數的停止而被燒毀。
像數組、字符串、靜態分派的內存等都是一系列數據的聚集,沒有方法經由過程一個參數全體傳入函數外部,只能傳遞它們的指針,在函數外部經由過程指針來影響這些數據聚集。
有的時刻,關於整數、小數、字符等根本類型數據的操作也必需要借助指針,一個典范的例子就是交流兩個變量的值。
有些初學者能夠會應用上面的辦法來交流兩個變量的值:
#include <stdio.h> void swap(int a, int b){ int temp; //暫時變量 temp = a; a = b; b = temp; } int main(){ int a = 66, b = 99; swap(a, b); printf("a = %d, b = %d\n", a, b); return 0; }
運轉成果:
a = 66, b = 99
從成果可以看出,a、b 的值並沒有產生轉變,交流掉敗。這是由於 swap() 函數外部的 a、b 和 main() 函數外部的 a、b 是分歧的變量,占用分歧的內存,它們除名字一樣,沒有其他任何干系,swap() 交流的是它外部 a、b 的值,不會影響它內部(main() 外部) a、b 的值。
改用指針變量作參數後就很輕易處理下面的成績:
#include <stdio.h> void swap(int *p1, int *p2){ int temp; //暫時變量 temp = *p1; *p1 = *p2; *p2 = temp; } int main(){ int a = 66, b = 99; swap(&a, &b); printf("a = %d, b = %d\n", a, b); return 0; }
運轉成果:
a = 99, b = 66
挪用 swap() 函數時,將變量 a、b 的地址分離賦值給 p1、p2,如許 *p1、*p2 代表的就是變量 a、b 自己,交流 *p1、*p2 的值也就是交流 a、b 的值。函數運轉停止後固然會將 p1、p2 燒毀,但它對內部 a、b 形成的影響是“耐久化”的,不會跟著函數的停止而“恢回復復興樣”。
須要留意的是暫時變量 temp,它的感化特殊主要,由於履行*p1 = *p2;語句後 a 的值會被 b 的值籠罩,假如不先將 a 的值保留起來今後就找不到了。
用數組作函數參數
數組是一系列數據的聚集,沒法經由過程參數將它們一次性傳遞到函數外部,假如願望在函數外部操作數組,必需傳遞數組指針。上面的例子界說了一個函數 max(),用來查找數組中值最年夜的元素:
#include <stdio.h> int max(int *intArr, int len){ int i, maxValue = intArr[0]; //假定第0個元素是最年夜值 for(i=1; i<len; i++){ if(maxValue < intArr[i]){ maxValue = intArr[i]; } } return maxValue; } int main(){ int nums[6], i, maxValue; int len = sizeof(nums)/sizeof(int); //讀取用戶輸出的數據並賦值給數組元素 for(i=0; i<len; i++){ scanf("%d", nums+i); } printf("Max value is %d!\n", max(nums, len)); return 0; }
運轉成果:
12 55 30 8 93 27↙
Max value is 93!
參數 intArr 僅僅是一個數組指針,在函數外部沒法經由過程這個指針取得數組長度,必需將數組長度作為函數參數傳遞到函數外部。數組 nums 的每一個元素都是整數,scanf() 在讀取用戶輸出的整數時,請求給出存儲它的內存的地址,nums+i就是第 i 個數組元素的地址。
用數組做函數參數時,參數也可以或許以“真正”的數組情勢給出。例如關於下面的 max() 函數,它的參數可以寫成上面的情勢:
int max(int intArr[6], int len){ int i, maxValue = intArr[0]; //假定第0個元素是最年夜值 for(i=1; i<len; i++){ if(maxValue < intArr[i]){ maxValue = intArr[i]; } } return maxValue; }
int intArr[6]似乎界說了一個具有 6 個元素的數組,挪用 max() 時可以將數組的一切元素“一股腦”傳遞出去。
讀者也能夠省略數組長度,把形參簡寫為上面的情勢:
int max(int intArr[], int len){ int i, maxValue = intArr[0]; //假定第0個元素是最年夜值 for(i=1; i<len; i++){ if(maxValue < intArr[i]){ maxValue = intArr[i]; } } return maxValue; }
int intArr[]固然界說了一個數組,但沒有指定命組長度,似乎可以接收隨意率性長度的數組。
現實上這兩種情勢的數組界說都是假象,不論是int intArr[6]照樣int intArr[]都不會創立一個數組出來,編譯器也不會為它們分派內存,現實的數組是不存在的,它們終究照樣會轉換為int *intArr如許的指針。這就意味著,兩種情勢都不克不及將數組的一切元素“一股腦”傳遞出去,年夜家還得規規則矩應用數組指針。
int intArr[6]這類情勢只能解釋函數希冀用戶傳遞的數組有 6 個元素,其實不意味著數組只能有 6 個元素,真正傳遞的數組可以有少於或多於 6 個的元素。
須要強調的是,不論應用哪一種方法傳遞數組,都不克不及在函數外部求得數組長度,由於 intArr 僅僅是一個指針,而不是真實的數組,所以必需要額定增長一個參數來傳遞數組長度。
C說話為何不許可直接傳遞數組的一切元素,而必需傳遞數組指針呢?
參數的傳遞實質上是一次賦值的進程,賦值就是對內存停止拷貝。所謂內存拷貝,是指將一塊內存上的數據復制到另外一塊內存上。
關於像 int、float、char 等根本類型的數據,它們占用的內存常常只要幾個字節,對它們停止內存拷貝異常疾速。而數組是一系列數據的聚集,數據的數目沒無限制,能夠很少,也能夠不計其數,對它們停止內存拷貝有能夠是一個漫長的進程,會嚴重拖慢法式的效力,為了避免身手欠安的法式員寫出低效的代碼,C說話沒有從語法上支撐數據聚集的直接賦值。
除C說話,C++、Java、Python 等其它說話也制止對年夜塊內存停止拷貝,在底層都應用相似指針的方法來完成。
以上就對C 說話指針變量作為函數參數停止的材料整頓,後續持續整頓相干常識,感謝年夜家對本站的支撐!