我們?cè)谇懊嬷v了在 C 語(yǔ)言中,數(shù)組參數(shù)會(huì)退化為指針。那么這是為什么呢?在 C 語(yǔ)言中只會(huì)以值拷貝的方式傳遞參數(shù),當(dāng)向函數(shù)傳遞數(shù)組時(shí),不是將整個(gè)數(shù)組拷貝一份傳入函數(shù)而是將數(shù)組名看做常量指針傳數(shù)組首元素地址。
成都創(chuàng)新互聯(lián)公司堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。十多年網(wǎng)站建設(shè)經(jīng)驗(yàn)成都創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營(yíng)銷服務(wù)商,為您提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、html5、網(wǎng)站制作、成都品牌網(wǎng)站建設(shè)、小程序制作服務(wù),給眾多知名企業(yè)提供過(guò)好品質(zhì)的建站服務(wù)。
那么當(dāng)初在設(shè)立 C 語(yǔ)言時(shí),主要是用于 Unix 操作系統(tǒng),而 Unix 效率要求很高。所以 C 語(yǔ)言以高效作為最初設(shè)計(jì)目標(biāo):a> 參數(shù)傳遞的時(shí)候如果拷貝整個(gè)數(shù)組執(zhí)行效率將會(huì)大大下降;b> 參數(shù)位于棧上,太大的數(shù)組拷貝將導(dǎo)致棧溢出。函數(shù)調(diào)用棧是用一片內(nèi)存來(lái)存放的,如果棧溢出,那么函數(shù)調(diào)用將無(wú)法執(zhí)行,程序?qū)?huì)崩了。
二維數(shù)組參數(shù)同樣也存在退化,它可以看做是一維數(shù)組,它中的每個(gè)元素是一維數(shù)組。二維數(shù)組參數(shù)中第一維的參數(shù)可以省略,如:void f(int a[5]) ==> void f(int a[]) ==> void f(int* a); void g(int a[3][3]) ==> void g(int [][3]) ==> void g(int (*a)[3]);那么我們平時(shí)所說(shuō)的一維數(shù)組作為參數(shù)時(shí)將會(huì)退化為一維指針,二維數(shù)組并不會(huì)退化為二維指針,而是退化為數(shù)組指針。那么什么樣的參數(shù)將退化為二維指針呢?我們總結(jié)了下面這張表
數(shù)組參數(shù) | 等效的指針參數(shù) |
一維數(shù)組:float a[5] | 指針:float* a |
指針數(shù)組:int* a[5] | 指針的指針:int** a |
二維數(shù)組:char a[3][4] | 數(shù)組的指針:char(*a)[4] |
我們可以看出指針數(shù)組作為參數(shù)時(shí)才退化為二維指針。那么在 C 語(yǔ)言中無(wú)法向一個(gè)函數(shù)傳遞任意多的多維數(shù)組,必須提供除第一維之外的所有維長(zhǎng)度;其中第一維之外的維度信息用于完成指針運(yùn)算,N維數(shù)組的本質(zhì)是一維數(shù)組,元素是 N - 1 維的數(shù)組,對(duì)于多維數(shù)組的函數(shù)參數(shù)只有第一維是可變的。下來(lái)我么以代碼為例進(jìn)行分析,代碼如下
#include <stdio.h> void access(int a[][3], int row) { int col = sizeof(*a) / sizeof(int); int i = 0; int j = 0; printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(*a) = %d\n", sizeof(*a)); for(i=0; i<row; i++) { for(j=0; j<col; j++) { printf("%d\n", a[i][j]); } } printf("\n"); } int main() { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int aa[2][2] = {0}; access(a, 3); access(aa, 2); return 0; }
我們看到在程序中我們?cè)诘?5和26行分別定義了3*3,2*2的二維數(shù)組,但是 access 函數(shù)里參數(shù)的數(shù)組參數(shù)第二維指定是3。所以我們?cè)诘?9行調(diào)用這個(gè)函數(shù)會(huì)報(bào)錯(cuò),因?yàn)轭愋筒黄ヅ洹N覀儊?lái)看看編譯結(jié)果
我們看到它報(bào)警告了,也就是說(shuō)這個(gè)程序雖然通過(guò)編譯了,但是它允許的結(jié)果是不確定的。我們看到我們定義的 aa 數(shù)組是 2*2 的,但是它打印出了6個(gè)數(shù),也就是當(dāng)成 2*3 的了。所以我們這樣調(diào)用是不對(duì)的。
下來(lái)我們看個(gè)三維數(shù)組的代碼,代碼如下
#include <stdio.h> void access_ex(int b[][2][3], int n) { int i = 0; int j = 0; int k = 0; printf("sizeof(b) = %d\n", sizeof(b)); printf("sizeof(*b) = %d\n", sizeof(*b)); for(i=0; i<n; i++) { for(j=0; j<2; j++) { for(k=0; k<3; k++) { printf("%d\n", a[i][j][k]); } } } printf("\n"); } int main() { int aa[2][2] = {0}; int b[1][2][3] = {0}; access_ex(b, 1); access_ex(aa, 2); return 0; }
我們?cè)?access_ex 函數(shù)里指定的是第二維是2,第三維是3。但是我們定義的數(shù)組 aa 不是這樣的,我們看看編譯結(jié)果
我們看到第二個(gè)編譯出的結(jié)果也是不確定的。通過(guò)本節(jié)對(duì)數(shù)組參數(shù)和指針參數(shù)的學(xué)習(xí),總結(jié)如下:1、C 語(yǔ)言中只會(huì)以值拷貝的方式傳遞參數(shù),并且數(shù)組參數(shù)必然退化為指針;2、多維數(shù)組參數(shù)必須提供除第一維之外的所有維長(zhǎng)度;3、對(duì)于多維數(shù)組的函數(shù)參數(shù)值第一維是可變的。
歡迎大家一起來(lái)學(xué)習(xí) C 語(yǔ)言,可以加我QQ:243343083。
新聞名稱:C之?dāng)?shù)組參數(shù)和指針參數(shù)(三十一)
文章起源:http://jinyejixie.com/article38/ggcppp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站排名、關(guān)鍵詞優(yōu)化、靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)