1. 程式人生 > >指標函式與函式指標的區別

指標函式與函式指標的區別

二、指標的指標指標的指標看上去有些令人費解。它們的宣告有兩個星號。例如:
        char ** cp;
    
如果有三個星號,那就是指標的指標的指標,四個星號就是指標的指標的指標的指標,依次類推。當你熟悉了簡單的例子以後,就可以應付複雜的情況了。當然,實際程式中,一般也只用到  二級指標,三個星號不常見,更別說四個星號了。指標的指標需要用到指標的地址。
        char c='A';
        char *p=&c;
        char **cp=&p;
    
通過指標的指標,不僅可以訪問它指向的指標,還可以訪問它指向的指標所指向的資料。下面就是幾個這樣的例子:

        char *p1=*cp;
        char c1=**cp;
    
你可能想知道這樣的結構有什麼用。利用指標的指標可以允許被呼叫函式修改區域性指標變數和處理指標陣列。

        void FindCredit(int **);

        main()
        {
            int vals[]={7,6,5,-4,3,2,1,0};
            int *fp=vals;
            FindCredit(&fp);
            printf(%d\n,*fp);
        }

        void FindCredit(int ** fpp)
        {
            while(**fpp!=0)
            if(**fpp<0) break;
            else (*fpp)++;
        }

    
首先用一個數組的地址初始化指標fp,然後把該指標的地址作為實參傳遞給函式FindCredit()FindCredit()函式通過表示式**fpp間接地得到陣列中的資料。為遍歷陣列以找到一個負值,FindCredit()函式進行自增運算的物件是呼叫者的指向陣列的指標,而不是它自己的指向呼叫者指標的指標。語句(*fpp)++就是對形參指標指向的指標進行自增運算的。但是因為*運算子高於++運算子,所以圓括號在這裡是必須的,如果沒有圓括號,那麼++運算子將作用於二重指標fpp上。三、指向指標陣列的指標指標的指標另一用法舊處理指標陣列。有些程式設計師喜歡用指標陣列來代替多維陣列,一個常見的用法就是處理字串。


        char *Names[]=
        {
             Bill,
             Sam,
             Jim,
             Paul,
             Charles,
             0
        };

        main()
        {
            char **nm=Names;
            while(*nm!=0) printf(%s\n,*nm++);
        }

    
先用字元型指標陣列Names的地址來初始化指標nm。每次printf()的呼叫都首先傳遞指標nm指向的字元型指標,然後對nm進行自增運算使其指向陣列的下一個元素(還是指標)。注意完成上述認為的語法為*nm++,它首先取得指標指向的內容,然後使指標自增。注意陣列中的最後一個元素被初始化為0while迴圈以次來判斷是否到了陣列末尾。具有零值的指標常常被用做迴圈陣列的終止符。程式設計師稱零值指標為空指標(NULL)。採用空指標作為終止符,在樹種增刪元素時,就不必改動遍歷陣列的程式碼,因為此時陣列仍然以空指標作為結束。