亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        淺談C語(yǔ)言中函數(shù)形參為地址類(lèi)型的定義形式和類(lèi)型自動(dòng)轉(zhuǎn)換

        2017-11-14 23:20:02田媛
        電腦知識(shí)與技術(shù) 2017年29期
        關(guān)鍵詞:數(shù)組等價(jià)指針

        田媛

        摘要:當(dāng)函數(shù)參數(shù)為地址類(lèi)型時(shí),可以有多種定義形式,因而讀者易產(chǎn)生迷惑,通過(guò)對(duì)各種實(shí)例的分析和證明,介紹了按各種形式定義的參數(shù)的本質(zhì);同時(shí)研究了當(dāng)?shù)刂奉?lèi)型實(shí)參和形參類(lèi)型不同時(shí)的自動(dòng)轉(zhuǎn)換。

        關(guān)鍵詞:地址;形式參數(shù);實(shí)際參數(shù);類(lèi)型轉(zhuǎn)換

        中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)29-0118-02

        當(dāng)函數(shù)形式參數(shù)(簡(jiǎn)稱(chēng)形參)類(lèi)型為普通類(lèi)型的數(shù)值類(lèi)型時(shí),參數(shù)的定義形式以及不同當(dāng)形參和實(shí)參類(lèi)型不符時(shí)發(fā)生的自動(dòng)轉(zhuǎn)換,各類(lèi)教科書(shū)已進(jìn)行了詳盡講解。而當(dāng)函數(shù)形參類(lèi)型為地址類(lèi)型時(shí),它的定義形式多種多樣,而且當(dāng)?shù)刂奉?lèi)型實(shí)參和形參發(fā)生類(lèi)型不匹配時(shí)的數(shù)據(jù)轉(zhuǎn)換,還很少有資料專(zhuān)門(mén)研究總結(jié)。

        本文針對(duì)這些問(wèn)題,通過(guò)舉合適的例做了證明和研究,對(duì)各種地址類(lèi)型的形參的形式及本質(zhì)做了總結(jié),同時(shí)研究了地址類(lèi)型數(shù)據(jù)的自動(dòng)轉(zhuǎn)換。

        1 函數(shù)形參為一級(jí)指針

        當(dāng)函數(shù)形參類(lèi)型為一級(jí)指針(即普通變量的地址)時(shí),它的形式通常有一級(jí)指針和普通一維數(shù)組兩種形式。

        void fun1(char *a) //此處等價(jià)于(char a[ ]),數(shù)組的維數(shù)無(wú)需指出

        { int i;

        for(i=0;i<=5;i++)

        { putchar(*(a+i)); //此處等價(jià)于putchar(a[i]);

        }

        }

        main( )

        { char b[]="a1b2c3";

        char *p;

        p=b; // 等價(jià)于 p=&b[0];

        fun1(b); // 等價(jià)于fun1(p);

        }

        此處形參的兩種定義形式char *a與 char a[ ]是等價(jià)的,形參a的本質(zhì)就是一個(gè)一級(jí)指針(指向普通變量的指針)。當(dāng)我們需要對(duì)數(shù)組變量操作時(shí),形參通常寫(xiě)成數(shù)組的形式,更加便于讀者的理解,而當(dāng)對(duì)普通變量操作時(shí),形參通常寫(xiě)成一級(jí)指針形式。程序執(zhí)行結(jié)果如圖1。

        2 函數(shù)形參為數(shù)組指針

        當(dāng)函數(shù)形參類(lèi)型為數(shù)組指針(指向一維數(shù)組的指針)時(shí),其形式通常為數(shù)組指針(很多資料中也稱(chēng)為行指針)和二維數(shù)組。

        void fun1(char (*a)[4]) //此處等價(jià)于(char a[ ][4]),數(shù)組的第一維無(wú)需指出

        //若參數(shù)說(shuō)明為char a[ ][ ],則編譯就會(huì)發(fā)生錯(cuò)誤,二維數(shù)組必須指定列維數(shù)

        { int i;

        for(i=0;i<3;i++)

        puts(*(a+i)); //此處等價(jià)于 puts(a[i])

        }

        main()

        { char b[3][4]={"abc","xyz","aaa"};

        char (*p)[4];

        p=b; // 此處等價(jià)于 p=&b[0];

        fun1(p); //fun1(b);運(yùn)行結(jié)果都一樣

        }

        程序運(yùn)行結(jié)果為:

        了解了數(shù)組指針形式的本質(zhì)后,我們可以把數(shù)組指針擴(kuò)展到多維數(shù)組,比如對(duì)于三維數(shù)組形式,void fun( char p[ ][4][3])和void fun( char (*p)[4][3])是等價(jià)的。

        3 函數(shù)形參為二級(jí)指針

        當(dāng)函數(shù)形參類(lèi)型為二級(jí)指針(指向一級(jí)指針的指針)時(shí),它的形式通常有二級(jí)指針形式和指針數(shù)組形式。

        void fun(char **a) //此處等價(jià)于(char *a[ ])

        { int i;

        for(i=0;i<3;i++)

        puts(*(a+i)); //或puts(a[i])

        }

        main( )

        { char *p1[3],**p2;

        char b[3][7]={"abccde","deawff","gaaahi"};

        p1[0]=b[0];

        p1[1]=b[1];

        p1[2]=b[2];

        p2=&p1[0]; /p1[0]存放的是地址 ,&p1[0]則是p1[0]的地址,也即指針的指針

        fun(p2);//等價(jià)于fun(p1)

        }

        程序運(yùn)行結(jié)果為:

        對(duì)于此處指針形式的研究,可以參照在1中分析的 char *a與char a[ ]作為參數(shù)形式時(shí)本質(zhì)是一致的,那么char **a與char *a[ ]也是一致的,我們已經(jīng)做實(shí)驗(yàn)驗(yàn)證。

        在實(shí)際編程中,讀者可依據(jù)自己的喜好選擇參數(shù)的定義形式,通常情況下,指針數(shù)組的形式更加易于理解,但當(dāng)我們探究清楚參數(shù)類(lèi)型的本質(zhì)后,就可以靈活自如使用。

        在1、2和3中我們總結(jié)了有關(guān)形式參數(shù)類(lèi)型為地址類(lèi)型的各種定義形式,并且在實(shí)際調(diào)用中,實(shí)參的類(lèi)型和形參都一致,那么當(dāng)函數(shù)調(diào)用時(shí),實(shí)參并不是和形參同樣類(lèi)型的地址數(shù)值時(shí),又會(huì)發(fā)生什么樣的情況?

        4 指針類(lèi)型數(shù)據(jù)的轉(zhuǎn)換

        有關(guān)數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換,對(duì)于非地址類(lèi)型的數(shù)據(jù)已有很多例題和資料講述,在指針中只強(qiáng)調(diào)了強(qiáng)制類(lèi)型轉(zhuǎn)換,而地址類(lèi)型的自動(dòng)轉(zhuǎn)換卻很少提及。

        經(jīng)常在各類(lèi)計(jì)算機(jī)考試中或教科書(shū)中有這樣的題目:

        Char str[10];下列調(diào)用正確的是:

        A)gets(str) B)gets(&str) C)gets(str[0])

        給出的正確答案往往是A,其實(shí)B也是正確的。

        在函數(shù)調(diào)用及賦值中,地址類(lèi)型的數(shù)據(jù)間也會(huì)發(fā)生自動(dòng)轉(zhuǎn)換。endprint

        系統(tǒng)函數(shù)puts的函數(shù)原型是int puts(const char *s),我們利用1中分析,此處等價(jià)于int puts(const char s[ ]),顯然,參數(shù)s要求傳遞的是一個(gè)列地址,而在4中所舉的例子,實(shí)參str、str+1、str+2是行地址,但我們可以看到程序運(yùn)行的結(jié)果依然正確。這里就是因?yàn)閷?shí)參和形參不一致時(shí),當(dāng)它們的類(lèi)型是地址類(lèi)型也會(huì)發(fā)生自動(dòng)轉(zhuǎn)換。

        main()

        { int (*ptr1)[2]; //此處ptr1是一個(gè)數(shù)組指針,指向長(zhǎng)度為2的數(shù)組

        int a[6]={0,1,2,3,4,5};

        int *ptr=&a;

        printf("(1)%d,%d \n",*(ptr),*(ptr+2));

        /*此處的ptr指針應(yīng)該指向一個(gè)普通的int變量,所以應(yīng)該存放a數(shù)組成員的地址,而此處&a并不代表a[0]的地址,它是一個(gè)行地址,在編譯時(shí),系統(tǒng)會(huì)有警告出現(xiàn)。但系統(tǒng)會(huì)進(jìn)行數(shù)據(jù)的自動(dòng)轉(zhuǎn)換,將這個(gè)行地址轉(zhuǎn)換成一個(gè)列地址,因而 printf("%d,%d",*(ptr),*(ptr+2))會(huì)輸出a[0]和a[2]的值。*/

        ptr1=a+1;

        /*常規(guī)的賦值,ptr1應(yīng)該存放一個(gè)行地址,而此處a+1顯然是一個(gè)列地址,是成員a[1]的地址。但此處系統(tǒng)會(huì)進(jìn)行自動(dòng)轉(zhuǎn)換,將列地址轉(zhuǎn)換為了行地址。*/

        printf("(2)%d,%d \n",(*ptr)[0],(*ptr)[1]); //輸出a[1],a[2]的值

        printf("(3)%d,%d \n ",(*(ptr+1))[0], (*(ptr+1))[1]);//輸出a[3],a[4]的值

        }

        地址類(lèi)型的自動(dòng)數(shù)據(jù)轉(zhuǎn)換,通常發(fā)生在行地址和列地址之間。弄懂了這種賦值的自動(dòng)轉(zhuǎn)換,那么在函數(shù)調(diào)用中出現(xiàn)了類(lèi)型不一致時(shí)也是如此。如下例:

        main()

        { char str[3][4]={"abc","123","x8y"};

        puts(str+1); // 系統(tǒng)自動(dòng)轉(zhuǎn)化為puts(str[1]),輸出串123

        }

        5 結(jié)束語(yǔ)

        本文通過(guò)實(shí)例說(shuō)明如下兩點(diǎn):

        1) 總結(jié)了函數(shù)形參類(lèi)型為地址類(lèi)型數(shù)據(jù)時(shí)的各種不同定義形式及本質(zhì)。

        2) 當(dāng)?shù)刂奉?lèi)型數(shù)據(jù)之間進(jìn)行賦值和參數(shù)傳遞時(shí),存在數(shù)據(jù)的自動(dòng)轉(zhuǎn)換。

        參考文獻(xiàn):

        [1] 丁留海. C語(yǔ)言指針的底層原理[J]. 電子技術(shù)與軟件工程, 2016(21):257-258.

        [2] 譚浩強(qiáng). C語(yǔ)言程序設(shè)計(jì)[M]. 3版.北京: 清華大學(xué)出版社, 2005.

        [3] 蔣清明. C語(yǔ)言程序設(shè)計(jì)[M]. 北京: 人民郵電出版社, 2005.endprint

        猜你喜歡
        數(shù)組等價(jià)指針
        JAVA稀疏矩陣算法
        JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
        偷指針的人
        n次自然數(shù)冪和的一個(gè)等價(jià)無(wú)窮大
        中文信息(2017年12期)2018-01-27 08:22:58
        為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
        尋找勾股數(shù)組的歷程
        收斂的非線(xiàn)性迭代數(shù)列xn+1=g(xn)的等價(jià)數(shù)列
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
        ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
        環(huán)Fpm+uFpm+…+uk-1Fpm上常循環(huán)碼的等價(jià)性
        老熟女老女人国产老太| 欧美性一区| 亚洲av永久久无久之码精| 日本一区二区三级在线| 伊甸园亚洲av久久精品| 色妞www精品视频| 中文字幕无码免费久久9一区9 | 日本老熟欧美老熟妇| 免费无码毛片一区二区app| 老太脱裤让老头玩ⅹxxxx| 亚洲色欲Aⅴ无码一区二区| av资源在线永久免费观看 | 久久这里只有精品黄色| av日韩高清一区二区| 亚洲熟妇无码一区二区三区导航| 另类免费视频在线视频二区| 国产三级在线观看性色av| 国产精品成人一区二区不卡| 日本老熟妇乱| 无码精品一区二区免费AV| 中文字幕色婷婷在线视频| 亚洲精品国产精品乱码在线观看 | 91spa国产无码| 亚洲女同一区二区久久| 国产一区二区三区亚洲avv| 9 9久热re在线精品视频| 久久综合网天天 | 国产精品人成在线765| 九九精品国产亚洲av日韩| 在办公室被c到呻吟的动态图| 熟妇人妻中文av无码| 久久久国产精品粉嫩av| 久久精品国产亚洲av不卡国产| 欧美成人精品午夜免费影视| 中文人成影院| 亚洲一区二区av免费观看 | 欧美最大胆的西西人体44| 国产精品欧美久久久久老妞 | 精品精品国产一区二区性色av| 玩弄放荡人妇系列av在线网站| 亚洲欧美日韩一区在线观看|