成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C之?dāng)?shù)組參數(shù)和指針參數(shù)(三十一)

        我們?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é)果

C之?dāng)?shù)組參數(shù)和指針參數(shù)(三十一)

        我們看到它報(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é)果C之?dāng)?shù)組參數(shù)和指針參數(shù)(三十一)

        我們看到第二個(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)

成都app開(kāi)發(fā)公司
聊城市| 滨海县| 湘乡市| 陈巴尔虎旗| 衡阳市| 墨江| 观塘区| 屯昌县| 开江县| 加查县| 深圳市| 长岭县| 新疆| 太康县| 彭水| 西平县| 贵阳市| 芷江| 九江市| 若尔盖县| 庆元县| 万山特区| 绿春县| 延川县| 襄垣县| 肇源县| 舒城县| 青浦区| 阿城市| 婺源县| 西乌珠穆沁旗| 凭祥市| 西华县| 闽侯县| 酉阳| 鄯善县| 荔浦县| 胶州市| 嘉义市| 新田县| 静安区|