????今天學習了指針的兩個常用場景,在此記錄,以便后續查看。
場景1:傳數組
????在c語言中,我們在定義函數的時候是沒有辦法直接傳一個數組進去的,為了解決這個問題,我們一般將數組的名稱當作一個指針參數傳入到函數的參數列表中,因為數組的名稱類似于一個常量指針,將其傳入函數后,再傳入數組的長度,就可以在函數內部訪問這個數組。原因在于,指針記錄的是一個地址,我們將這個地址作為一個參數傳入方法內部時,相當于這個方法也訪問到了這個地址,進而可以訪問到這個數組。但這里有一個問題,我們一般在調用子函數時,傳入的參數一般都是重新找一塊地址將參數內容復制,子函數使用的是復制的部分,這樣子函數就不會改變外部參數的值。但現在用指針的話,就不會進行復制了,而是直接訪問同一地址,這樣就可能對原數組進行更改。解決方法就是在傳參時,給傳入的指針前加上const,表示只讀。這樣原數組就不會被改變,如果子函數中嘗試改變原數組,系統就會報錯。舉例如下:
#include?<stdio.h>int?CAL(int?*p,int?count) {int?total = p[0];for?(int?i = 1; i < count; i++){total += p[i];}return?total;}int?main() {int?a[] = {1,2,3,4,5};int?b=CAL(a,5);printf("%d\n",b);return?0;}
結果:15
場景2:傳回多個參數
????我們在聲明函數時,c語言一般只能返回一個值,像其他語言,比如C#中,我們可以使用out參數來返回多個值,但c語言沒有這種參數,我們一般用指針來進行多個參數的返回。就像上面說的,指針會指向一個地址,我們在傳入參數時,我們假設想返回兩個值,那我們就給函數傳入兩個指針,我們在內部改變這兩個指針地址所存的數據后,我們在函數外部訪問這個兩個地址即可,即可完成多個參數的返回。舉例如下:
#include?<stdio.h>void?TwoTotal(int?*p,int?count1,int?*q,int?count2,int?*pp,int*qq) {*pp?= p[0];for?(int?i = 1; i < count1; i++){*pp?+= p[i];}*qq?= p[0];for?(int?i = 1; i < count2; i++){*qq?+= q[i];}}int?main() {int?p[] = { 1,2,3,4,5 };int?q[] = {1,2,3,4,5,6,7};int?total1 = 0;int?total2 = 0;TwoTotal(p,5,q,7,&total1,&total2);printf("%d\n", total1);printf("%d\n", total2);return?0;}
結果:
15
28