在c語言中,向函式傳遞引數只有一種形式——值傳遞。不管是傳遞乙個整型變數,還是傳遞乙個指標,函式得到的都只是實參的拷貝值。
先定義乙個一維整型陣列:
int a =;
首先明確一點:陣列名和指標是兩個不同的概念,儘管陣列名在絕大部分情況下被隱式轉換成指標使用。
我們沒辦法真正地把陣列傳遞給函式,我們只能傳遞乙份指向陣列起始位置的指標的拷貝。
函式原型:
void func(int *a);
void func(int a);
在當前這個上下文環境中,二者等價。你可以使用任何一種宣告,如果要說哪一種最準確,應該是第一種。因為實參實際上是個指標,而不是陣列。
這樣我們就把指向陣列首元素的指標的拷貝傳遞給了函式。在實際應用中,我們通常還會傳遞另乙個引數,用來表示陣列的長度:
void func(int *a, int
len);
通過第二個引數,我們可以很方便地在函式內遍歷這個陣列:
void func(int *a, int
len)
}func(a,10); // 列印陣列a的所有元素
int b[2][3] = ,
};
我們實際上要向陣列傳遞乙個指向陣列首元素的指標的拷貝,首先必須搞清楚陣列名b
的型別應該是:
int
(*)[3]
陣列名的型別取決於陣列元素,陣列b
長度是2,每個元素是長度為3的整型陣列,所以b
的型別是上面那坨(如果這裡有疑問可以看我的另一篇文章《徹底弄懂c語言陣列名》)。
如果上面的內容沒有疑問,那麼就來看函式原型:
void func2(int (*p)[3]); // 兩種都可以,第一種更準確
void func2(int p[3]);
同樣地,我們可以傳遞另外兩個引數,分別表示行數和列數:
void func2(int (*p)[3], int len_i, int len_j);
但是請千萬注意:寫成二級指標是錯誤的!
void func2(int **p); // 不可以這樣~>_
為什麼不行呢?因為指向指標的指標和指向陣列的指標是不同的。如果這樣寫,有可能你的程式能正確執行,但也有可能因為定址錯誤導致程式崩潰哦!
下面給出完整的例子:
但是,不知道你有沒有發現乙個問題,我們必須在函式原型中指定第二維的大小,這意味著函式不能復用。為了向函式傳遞乙個大小未知的陣列,我將介紹兩種技巧。
第一種是通過void *
指標接收乙個陣列,同時傳遞兩個引數標記行和列,然後在函式內部將void *
指標強制轉換成二維陣列。
c語言一維陣列做引數傳遞給函式
今天碰到了一維陣列做函式引數的問題,那就扒一扒這個問題 首先拋結論 1 c語言中,當一維陣列做函式引數時,編譯器總是把它解析成乙個指向其首元素的指標。2 實際傳遞的陣列大小與函式形參指定的陣列大小沒有關係。然後舉例說明 下面是乙個元素交換函式,把陣列array i 和array j 交換位置。注意看...
c語言一維陣列做引數傳遞給函式
今天碰到了一維陣列做函式引數的問題,那就扒一扒這個問題 首先拋結論 1 c語言中,當一維陣列做函式引數時,編譯器總是把它解析成乙個指向其首元素的指標。2 實際傳遞的陣列大小與函式形參指定的陣列大小沒有關係。然後舉例說明 下面是乙個元素交換函式,把陣列array i 和array j 交換位置。注意看...
C 的一維陣列和二維陣列
陣列 array 是一種資料格式,能夠儲存多個同型別的值。一維陣列 int a 3 char a 10 this is a 共有9個字元,包含空字元,a 9 將被系統自動賦值為 0 定義字元陣列,需要考慮到為最後的乙個結束符 0 預留出乙個位置,char陣列還可以這樣賦值 char a 10 上面兩...