站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        指針運算符與指針表達式

        6.3.1指針運算符與指針表達式
        在C中有兩個關于指針的運算符:
        ?&運算符:取地址運算符,&m即是變量m的地址。
        ?*運算符:指針運算符,*ptr表示其所指向的變量。
        [例6-2]從鍵盤輸入兩個整數(shù),按由大到小的順序輸出。
        main()
        {
        int*p1,*p2,a,b,t;/*定義指針變量與整型變量*/
        scanf(“%d,%d”,&a,&b);
        p1=&a;/*使指針變量指向整型變量*/
        p2=&b;
        if(*p1<*p2)
        {/*交換指針變量指向的整型變量*/
        t=*p1;
        *p1=*p2;
        *p2=t;
        }
        printf(“%d,%dn”,a,b);
        }
        在程序中,當執(zhí)行賦值操作p1=&a和p2=&b后,指針實實在在地指向了變量a與b,這時
        引用指針*p1與*p2,就代表了變量a與b。
        運行程序:
        RUN
        3,4
        4,3
        在程序運行過程中,指針與所指的變量之間的關系如圖6-4所示:
        指針運算符與指針表達式
        當指針被賦值后,其在內(nèi)存的安放如a),當數(shù)據(jù)比較后進行交換,這時,指針變量與所指向的變量的關系如b)所示,在程序的運行過程中,指針變量與所指向的變量其指向始終沒變。
        下面對程序做修改。
        [例6-3]
        main()
        {
        int*p1,*p2,a,b,*t;
        scanf(“%d,%d”,&a,&b);
        p1=&a;
        p2=&b;
        if(*p1<*p2)
        {/*指針交換指向*/
        t=p1;
        p1=p2;
        p2=t;
        }
        printf(“%d,%dn”,*p1,*p2);
        }
        程序的運行結果完全相同,但程序在運行過程中,實際存放在內(nèi)存中的數(shù)據(jù)沒有移動,而是將指向該變量的指針交換了指向。其示意如圖6-5:
        指針運算符與指針表達式
        當指針交換指向后,p1和p2由原來指向的變量a和b改變?yōu)橹赶蜃兞縝和a,這樣一來,*p1就表示變量b,而*p2就表示變量a。在上述程序中,無論在何時,只要指針與所指向的變量滿足p=&a;我們就可以對變量a以指針的形式來表示。此時p等效于&a,*p等效于變量a。
        6.3.2指針變量作函數(shù)的參數(shù)
        函數(shù)的參數(shù)可以是我們在前面學過的簡單數(shù)據(jù)類型,也可以是指針類型。使用指針類型做函數(shù)的參數(shù),實際向函數(shù)傳遞的是變量的地址。由于子程序中獲得了所傳遞變量的地址,在該地址空間的數(shù)據(jù)當子程序調用結束后被物理地保留下來。
        [例6-4]利用指針變量作為函數(shù)的參數(shù),用子程序的方法再次實現(xiàn)上述功能。
        main()
        {
        void chang();/*函數(shù)聲明*/
        int*p1,*p2,a,b,*t;
        scanf(“%d,%d”,&a,&b);
        p1=&a;
        p2=&b;
        chang(p1,p2);/*子程序調用*/
        printf(“%d,%dn”,*p1,*p2);
        return0;
        }
        void chang(int*pt1,int*pt2)
        {/*子程序實現(xiàn)將兩數(shù)值調整為由大到小*/
        intt;
        if(*pt1<*pt2)/*交換內(nèi)存變量的值*/
        {
        t=*pt1;*pt1=*pt2;*pt2=t;}
        return;
        }
        由于在調用子程序時,實際參數(shù)是指針變量,形式參數(shù)也是指針變量,實參與形參相結合,傳值調用將指針變量傳遞給形式參數(shù)pt1和pt2。但此時傳值傳遞的是變量地址,使得在子程序中pt1和pt2具有了p1和p2的值,指向了與調用程序相同的內(nèi)存變量,并對其在內(nèi)存存放的數(shù)據(jù)進行了交換,其效果與[例6-2]相同。
        思考下面的程序,是否也能達到相同的效果呢?
        main()
        {
        void chang();
        int*p1,*p2,a,b,*t;
        scanf(“%d,%d”,&a,&b);
        p1=&a;
        p2=&b;
        chang(p1,p2);
        printf(“%d,%dn”,*p1,*p2);
        }
        void chang(int*pt1,int*pt2)
        {
        int*t;
        if(*pt1<*pt2)
        {
        t=pt1;pt1=pt2;pt2=t;
        }
        return;
        }
        程序運行結束,并未達到預期的結果,輸出與輸入完全相同。其原因是對子程序來說,函數(shù)內(nèi)部進行指針相互交換指向,而在內(nèi)存存放的數(shù)據(jù)并未移動,子程序調用結束后,main()函數(shù)中p1和p2保持原指向,結果與輸入相同。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 久久99精品国产麻豆蜜芽| 亚洲国产精品无码久久98| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 久久精品成人免费网站| 人妻少妇精品无码专区二区| 久久久久国产精品三级网| 亚洲午夜久久久精品影院| 999精品视频| 老司机亚洲精品影院无码| 亚洲精品国产福利一二区| 久久久久亚洲精品天堂久久久久久| 亚洲色图国产精品| 久久这里只有精品久久| 丰满人妻熟妇乱又仑精品| 午夜精品乱人伦小说区| 色偷偷88欧美精品久久久| 精品综合久久久久久88小说| 国产精品免费在线播放| 国产精品被窝福利一区| 999久久久国产精品| 四虎国产精品永久一区| 国产2021精品视频免费播放| 国产精品免费福利久久| 精品久久久久久久无码| 国产在线精品一区二区中文| 亚洲国产精品成人久久| 亚洲午夜国产精品无码老牛影视| 亚洲一区精品无码| 亚洲AV无码久久精品成人| 午夜精品乱人伦小说区| 久久这里只有精品18| 久久精品国产亚洲av水果派| 国产麻豆精品久久一二三| 国产精品视频一区二区三区四| 精品无码一区二区三区爱欲| 国产精品久久久久AV福利动漫| 国产乱人伦偷精品视频免下载| 国内精品久久久久久99蜜桃| 国产成人精品日本亚洲网站| 996久久国产精品线观看| 欧美日韩精品一区二区三区|